远程仓库指 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]。

  1. 网页操作:在官 C 语言代码方 GitHub 仓库 fork 一个相同的仓库到你的 GitHub.

  2. 在你的仓库复制代码地址 [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 仓库。

  3. # 从 upstream 中获取最新的代码下载到本地,但是不会自动合并到本地分支中。一般和下面第二个命令一起使用。
    git fetch upstream
    # 将 upstream 的 master 分支合并到当前本地分支中,如果有冲突需要手动解决(本地分支的代码就与 upstream 的 master 分支保持同步)
    git merge upstream/master
    # 创建并切换到名为 fixBug 的新分支
    git checkout -b fixBug
    # 将当前分支 fixBug 推送到远程仓库 origin 上,并将本地分支和远程分支关联起来。
    git push -u origin fixBug
  4. 之后,你可以在 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
  5. 此时,你的 GitHub 仓库的 fixBug 分支的代码已经发生了变化,在 Pull requests 界面你可以找到提交 PR 的方法,然后就就可以按照社区要去提供代码了。对于本地的代码,一旦你创建分支之后,master 和 fixBug 就是两份代码了,你在 fixBug 的修改并不会影响到 master 的的代码。你可以通过 git checkout [分支名] 来切换到你想要的分支。你可以创建多个分支来确保工作的顺利进行。

  6. 其他有用的命令

    # 分支操作:
    # 查看所有分支
    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
阅读次数