远程仓库指 github 仓库(repositoris),本地仓库指自己被 git 管理的文件夹(含有.git 文件夹)。
重新与远程仓库建立联系,并可以提交代码(自己远程仓库有代码,本地无代码,比如重装系统或者换电脑):
如果只是本地没有了仓库,在与远程仓库建立链接时提示” 远程 origin 已存在 ",可以直接 commit+push。
# 克隆远程仓库到本地仓库
git clone git@github.com:username/repository_name.git(远程仓库地址ssh)
# cd 进本地仓库
cd 仓库
# 初始化 git
git init
# 与远程仓库建立链接(关联远程仓库,远程仓库名字叫 origin)
git remote add origin git@github.com:username/repository_name.git(远程仓库地址ssh)
# 获取远程更新
git fetch origin
# 把更新的内容合并到本地分支
git merge origin/main
# 对代码进行一些修改
git add .
git commit -m "..."
git push origin main
创建一个新的仓库:
# 首先在 github 上创建一个空仓库(之后其实就可以看到教程了) | |
# 创建一个 README.md 文件,并写入 "# test" | |
echo "# test" >> README.md | |
# 初始化.git 文件夹 | |
git init | |
# 将刚刚创建的 README.md 文件加入 git 管理 | |
git add README.md | |
# 创建一个提交(即刚刚 README.md 文件的变化) | |
git commit -m "first commit" | |
# 创建分支 main 作为默认分支 | |
git branch -M main | |
# 与远程仓库建立连接,远程仓库的名字默认是 origin(可换) | |
git remote add origin git@github.com:username/repository_name.git(远程仓库地址ssh) | |
# 将提交推送到远程仓库(-u 是指第一次提交) | |
git push -u origin main |
把本地的仓库提交到一个新建立的远程仓库(即远程仓库为空,本地已经有了一个包含.git 文件的仓库,希望不改变内容,将本地仓库推送到远程并关联)
# 与远程仓库建立连接(关联)
git remote add origin git@github.com:username/repository_name.git(远程仓库地址ssh)
# 与远程仓库建立连接,远程仓库的名字默认是 origin(可换)
git branch -M main
# 将提交推送到远程仓库(-u 是指第一次提交)
git push -u origin [分支名]
远程 origin/upstream 已存在:
# 查看远程配置
git remote -v
# 删除远程配置
git remote rm [远程仓库名] (一般是origin或者upstream)
# 更改远程配置(可以直接修改,不需要上一步的删除)
git remote set-url upstream [upstream的新地址]
fatal: 拒绝合并无关的历史:
# 需要将远程仓库和本地仓库关联起来:
git branch --set-upstream-to=origin/main main
# 然后使用 git pull 整合远程仓库和本地仓库
git pull --allow-unrelated-histories# 忽略版本不同造成的影响
如何给开源社区提交 PR
假设官方 GitHub 名叫 [officialName],你的 GitHub 名叫 [yourName],GitHub 仓库名字叫 [repository]。
网页操作:在官 C 语言代码方 GitHub 仓库 fork 一个相同的仓库到你的 GitHub.
在你的仓库复制代码地址 [your code SSH/HTTPS],在官方仓库复制代码地址 [official code SSH/HTTPS],然后
# 克隆你 GitHub 仓库到本地
git clone [your code SSH/HTTPS]
# 添加官方仓库地址
git remote add upstream [official code SSH/HTTPS]
# 检查仓库的远程信息
git remote -v
# 远程信息输出应为:
origin [your code SSH/HTTPS] (fetch)
origin [your code SSH/HTTPS] (push)
upstream [official code SSH/HTTPS] (fetch)
upstream [official code SSH/HTTPS] (push)
fetch 和 push 分别代表你在 fetch(拉取)和 push(推送)的 GitHub 仓库的地址,origin 代表你的 GitHub 仓库,upstream 代表官方的 GitHub 仓库。
# 从 upstream 中获取最新的代码下载到本地,但是不会自动合并到本地分支中。一般和下面第二个命令一起使用。
git fetch upstream
# 将 upstream 的 master 分支合并到当前本地分支中,如果有冲突需要手动解决(本地分支的代码就与 upstream 的 master 分支保持同步)
git merge upstream/master
# 创建并切换到名为 fixBug 的新分支
git checkout -b fixBug
# 将当前分支 fixBug 推送到远程仓库 origin 上,并将本地分支和远程分支关联起来。
git push -u origin fixBug
之后,你可以在 fixBug 分支上进行一些修改,然后通过一下步骤将修改好的代码 push 到 GitHub 仓库的对应分支。
当你需要切换分支时,你必须 commit 当前的代码。
你的每一次 comiit 都会有所记录,当你 push 后,会把所有的 commit 都交上去,如果你 commit 的文件涉及到一个 pr,那么 pr 中也会有所修改,记录你的 commit。
# 查看修改了那些文件
git status
# 查看修改内容
git diff
# add 提交
git add .
# commit 提交(如果官方仓需要 Signed-off-by 检查的就带账号邮箱信息)
git commit -m "xxxxx" -s
# 将过去的 n 个 commit 合并为一个 commit(等待尝试)
git rebase -i HEAD~n # 打开一个编辑器,将第二行开始的每一行的第一个单词从 pick 改为 squash。然后保存文件并退出。另一个编辑器会打开,在这里修改最终的提交信息。
# 将本次提交合并到上一次提交,如果你上一次提交已经 push 过,需要使用 --force 或者 --force-with-lease 选项来强制推送。可能会覆盖其他人在远程仓库上做的修改,谨慎使用。
git commit --amend # 会打开一个编辑器,让你修改提交信息。
# push 到远程仓
git push origin
此时,你的 GitHub 仓库的 fixBug 分支的代码已经发生了变化,在 Pull requests 界面你可以找到提交 PR 的方法,然后就就可以按照社区要去提供代码了。对于本地的代码,一旦你创建分支之后,master 和 fixBug 就是两份代码了,你在 fixBug 的修改并不会影响到 master 的的代码。你可以通过
git checkout [分支名]
来切换到你想要的分支。你可以创建多个分支来确保工作的顺利进行。其他有用的命令
# 分支操作:
# 查看所有分支
git bC语言代码
ranch(*代表当前所在分支)
# 删除分支
git branch -d [branchName](-d换为-D强制删除)
# 更改分支名
git branch -m [oldName] [newName]
# 从远程仓库 upstream 拉取代码(获取最新的代码,但不会将其合并到本地)
git fetch upstream
# 从远程仓库 origin 拉取代码(获取最新的代码,但不会将其合并到本地)
git fetch origin
# 比较本地仓库当前的分支 HEAD 和 upstream/master 分支之间的差异
git diff HEAD upstream/master
# 显示本地的 commit 历史版本
git log
# 根据 commit 历史版本号,可以进行版本回退
git reset [版本号]
# 将本地分支重置为最新拉取的 upstream 仓库的版本
git reset --hard upstream/<upstream_branch_name>
# 将本地分支重置为 oorigin 仓库的版本
git reset --hard origin/<origin_branch_name>
# 将本地仓库的更改推送到 origin(-f 选项强制推送更改,这将覆盖 origin 仓库中的所有更改)
git push -f origin <local_branch_name>
# 删除本地未跟踪的目录和文件(d 和 f 分别指目录和文件)
git clean -df
# 从 origin 指定的 (自己的)GitHub 仓库拉取代码
git fetch origin