Git 使用技巧

以下是一些关于git工作流程的建议。

如何解决与main分支的冲突

  • 首先将代码变基到最新的主分支

    # 前两步在完成一次后可以跳过。
    git remote add upstream [url to tvm repo]
    git fetch upstream
    git rebase upstream/main
    
  • git可能会显示一些它无法合并的冲突,比如conflicted.py

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

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

      git add conflicted.py
      
  • 然后你可以继续通过以下命令进行变基操作

    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
    

重置到最新的主分支

你可以随时使用git reset将你的版本重置到最新的主分支。 请注意所有本地更改将会丢失。 因此,请仅在没有任何本地更改或你的拉取请求刚被合并时执行此操作。

git fetch origin main
git reset --hard FETCH_HEAD

在重置后恢复之前的提交

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

git reflog

一旦获取到正确的哈希标签,你可以再次使用git reset将head指向正确的提交。

仅将最新的k次提交应用到主分支

有时,仅将您最近的k次变更应用到主分支上是有用的。 这种情况通常发生在您有其他m次提交已经合并到主分支, 而这些k次提交之前。直接对主分支进行变基可能会导致前m次提交出现合并冲突 (这些冲突可以安全地丢弃)。

你可以改用以下命令

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

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

强制推送的后果是什么

前两个技巧需要使用强制推送(force push),这是因为我们修改了提交的路径。只要更改的提交仅属于你自己,强制推送到你自己的fork仓库是可以的。