我如何将最后的N承诺集成到一个承诺中?


当前回答

让我们说 n 真的很大. 你不想处理每一个承诺. 你只是想要一个名为 new_feature_branch 的新分支,其中有 1 承诺和所有旧_feature_branch 的变化。

git checkout main 

# will contain changes all changes from old_feature_branch 
git checkout -b new_feature_branch 

# get all changes from old_feature_branch and stage them
for f in $(git --no-pager diff --name-only old_feature_branch ) ; do git checkout fencing -- $f ; done

git commit -m "one commit message"

其他回答

警告:“我的最后一个X承诺”可能是双重的。

  (MASTER)  
Fleetwood Mac            Fritz
      ║                    ║
  Add Danny  Lindsey     Stevie       
    Kirwan  Buckingham    Nicks                                              
      ║         ╚═══╦══════╝     
Add Christine       ║          
   Perfect      Buckingham
      ║           Nicks            
    LA1974══════════╝                                    
      ║                  
      ║                  
    Bill <══════ YOU ARE EDITING HERE
  Clinton        (CHECKED OUT, CURRENT WORKING DIRECTORY)              

在这个非常简短的历史 https://github.com/fleetwood-mac/band-history 存储库中,您已经打开了一个引用请求,将 Bill Clinton 承诺融入原始(MASTER) Fleetwood Mac 承诺中。

四个承诺:

想象任何人都不会关心阅读完整的存储库历史(实际上有一个存储库,点击上面的链接!) 你决定破坏这些承诺,所以你去运行 git reset --soft HEAD~4& git commit. 然后你 git push --force it to GitHub to clean up your PR.

你只是做了一个单一的承诺,从弗里茨到比尔·克林顿,因为你忘记了昨天你在这个项目的巴金汉尼克版本工作,而吉特日志不符合你在GitHub上看到的东西。

故事的道德

使用 git rebase -i <after-this-commit> 并在第二次和随后的命令中取代“squash”或“fixup”,如手册中所描述。

在此例子中, <after-this-commit> 是 SHA1 hash 或当前分支的 HEAD 的相对位置,从该分支的 Commits 被分析为 rebase 命令. 例如,如果用户希望从当前 HEAD 查看 5 个 Commits 在过去的命令是 git rebase -i HEAD~5.

如何回答与此类工作流相关的问题?

许多地方的承诺,混合了多种合并,从大师,最终推到远程,PR和合并到大师由审查员(是的,开发人员将更容易合并 - 经过大师,但团队认为这将减缓过程)。

我没有在这个页面上看到这样的工作流(这可能是我的眼睛)如果我正确地理解复制,多种融合将需要多种冲突解决方案。

所以,这似乎为我们工作。

git pull master git checkout -b new-branch git checkout -b new-branch-temp edit and commit a lot locally, merge master regularly git checkout new-branch git merge --squash new-branch-temp // puts all changes in stage git commit 'one message to rule them all' git push Reviewer does PR and merges to master。

在分支中,你想将承诺结合起来,运行:

git rebase -i HEAD~(n number of commits back to review)

例子:

git rebase -i HEAD~2

此将打开文本编辑器,您必须在每个承诺前更换“点击”,如果您希望这些承诺合并。

p, pick = 使用 commit

s, squash = 使用承诺,但输入前承诺

例如,如果您正在寻找将所有承诺合并到一个,则“选择”是您所做的第一个承诺,并且所有未来的承诺(位于第一个下方)都应该设置为“滑动”。如果使用vim,请使用 :x 在输入模式中保存和输出编辑器。

然后继续下调:

git add .

git rebase --continue

更多关于此和其他方式重新写下你的承诺历史,请参见这篇有用的文章

要避免在重定向同一分支中的承诺时不得不解决任何合并冲突,您可以使用下列命令:

git rebase -i <last commit id before your changes start> -s recursive -X 我們

要将所有承诺分成一个,当您被要求编辑将合并的承诺时(在旗帜上),更新所有但第一个行动,从选择到分解,如其他答案中所建议。

在这里,我们使用合并策略(旗帜)回归和战略选项(X)我们的,以确保历史上后来的承诺赢得任何合并冲突。

注意:不要把这与我们做别的事情的 git rebase 混淆。

引用: git rebase recursive merge 策略