如何只保留git rebase中的头部更改

Sme*_*mee 15 git git-rebase

我目前正处于经历十几次提交的漫长热身之中.我已经在我的开发过程中构建了一些内容,以便只有HEAD我希望保留的更改- 所有其他冲突(例如提交哈希b06a1dd)应该被删除.

有没有办法简单地删除所有与之相关>>>>>>> b06a1dd的更改并保留Git将<<<<<<< HEAD一举标记的更改,因此我不必继续键入git rebase --continue,处理更多提交哈希中的更多冲突,并且只保留HEAD更改?

Sco*_*don 25

如果你愿意在(git rebase --abort)上启动rebase ,那么这应该做你需要的:

git rebase -X ours upstream
Run Code Online (Sandbox Code Playgroud)

upstream您正在重新定位的分支在哪里.

正如在这个答案和其他地方所指出的那样,对于变基而言,ourstheirs标签相比,对于合并而言更加困惑.在启动rebase之后,Git创建一个匿名分支并开始对其进行提交.因为ours意味着"保持对当前分支的更改",所以当前分支将HEAD包含upstream已经应用的任何更改rebase.

  • 当已经在进行变基时,是否有任何方法可以在 *特定* 冲突中选择“我们的”或“他们的”更改? (2认同)
  • @AlexandroSánchez 您可以使用 git checkout --ours,请记住我们的和他们的在 rebase 期间交换,请参阅 https://git-scm.com/docs/git-checkout#git-checkout---ours (2认同)

Ray*_*Luo 8

为了完整起见,这是我从之前的回答和当前问答中的评论中学到的东西(归功于他们的作者):

  • 如果你愿意从头开始,并选择同一侧的所有提交,目前选择的答案git rebase --abort,然后git rebase -X ours upstream可以做的伎俩。
  • 但我想在实践中你不会想盲目地使用ourstheirs不查看每个提交。当“处于冗长的变基过程中”时,您可能希望为每个提交做出逐案决定。因此,您的实际选择将是:

    1. 要使用上游:

      git checkout --ours path/to/a/specific/file
      git add path/to/a/specific/file
      
      Run Code Online (Sandbox Code Playgroud)

      甚至更好,在这种情况下,您只需使用以下命令:

      git reset HEAD path/to/a/specific/file
      
      Run Code Online (Sandbox Code Playgroud)
    2. 使用您的功能分支:

      git checkout --theirs path/to/a/specific/file
      
      Run Code Online (Sandbox Code Playgroud)
    3. 或者以手动方式<<<< ... ==== ... >>>>在编辑器中解决每个问题。

PS:ourstheirs有做底垫时特殊的意义。

请注意,在 git rebase 和 git pull --rebase 期间,我们的和他们的可能会出现交换;--ours 给出了更改重新定位到的分支的版本,而 --theirs 给出了保存正在重新定位的工作的分支的版本。

这是因为 rebase 用于将远程历史作为共享规范的工作流,并将您在 rebase 的分支上完成的工作视为要集成的第三方工作,而您暂时承担了该角色在 rebase 期间规范历史的守护者。作为规范历史的守护者,您需要将远程的历史视为我们的(即“我们共享的规范历史”),而您在侧分支上所做的则是他们的(即“一个贡献者在其之上的工作”) )。