Git 使用技巧

以下是一些 git 工作流的技巧。

如何解决与 main 的冲突

  • 首先 rebase 到最新的 main 分支

    # The first two steps can be skipped after you do it once.
    git remote add upstream [url to tvm repo]
    git fetch upstream
    git rebase upstream/main
    
  • git 可能会显示一些无法合并的冲突,例如 conflicted.py

    • 手动修改文件以解决冲突。

    • 解决冲突后,通过以下命令将其标记为已解决

      git add conflicted.py
      
  • 然后你可以通过以下命令继续 rebase

    git rebase --continue
    
  • 最后推送到你的 fork,你可能需要在此处强制推送。

    git push --force
    

如何将多个提交合并为一个

有时我们想要合并多个提交,特别是当后面的提交只是对前面提交的修复时,以便创建一个包含一组有意义的提交的 PR。你可以按照以下步骤进行操作。

  • 在执行此操作之前,如果你之前没有配置过 git 的默认编辑器,请先配置。

    git config core.editor the-editor-you-like
    
  • 假设我们要合并最近的 3 个提交,输入以下命令

    git rebase -i HEAD~3
    
  • 它会弹出一个文本编辑器。将第一个提交设置为 pick,并将后面的提交更改为 squash

  • 保存文件后,它会弹出另一个文本编辑器,要求你修改合并后的提交消息。

  • 将更改推送到你的 fork,你需要强制推送。

    git push --force
    

重置到最新的 main 分支

你始终可以使用 git reset 将你的版本重置为最新的 main 分支。请注意,**你所有的本地更改都将丢失**。因此,仅在你没有本地更改或你的 pull request 刚被合并时才执行此操作。

git fetch origin main
git reset --hard FETCH_HEAD

在重置后恢复之前的提交

有时我们可能会错误地将分支重置为错误的提交。当发生这种情况时,你可以使用以下命令显示最近提交的列表

git reflog

一旦你获得正确的哈希值,你可以再次使用 git reset 将 head 更改为正确的提交。

仅将最新的 k 个提交应用到 main 分支

有时,仅将你最新的 k 个更改应用到 main 分支之上很有用。这通常发生在你还有其他 m 个提交已在这些 k 个提交之前合并的情况下。直接 rebase 到 main 分支可能会导致这些前 m 个提交(可以安全地丢弃)上出现合并冲突。

你可以改为使用以下命令

# k is the concrete number
# Put HEAD~2 for the last 1 commit.
git rebase --onto upstream/main HEAD~k

然后你可以强制推送到 main 分支。请注意,以上命令将丢弃最后 k 个提交之前的所有提交。

强制推送的后果是什么

前两个技巧需要强制推送,这是因为我们更改了提交的路径。强制推送到你自己的 fork 是可以的,只要更改的提交仅是你自己的即可。