GitHub 桌面分支和合并问题

GitHub desktop branching and merging issues

我希望有人能帮助我。我目前正在学习 Git 命令,但目前我使用的是 GitHub 的桌面版。我正在 运行 研究分支和合并的一些问题,想知道任何人都可以对我遇到的问题提供一些见解。

当我分支并使用各种提交和提交消息进行大量修改时,我希望在将其合并回 master 时能够在分支中保留提交历史记录。在我合并的那一刻,master 将在其历史记录中有提交(我也想要)但是分支会丢失所有提交历史记录。

我对使用 PowerShell 的 Git 命令非常满意,所以如果可以用 Git 命令解决我的任何问题,我会很乐意尝试。

以下是合并前您的历史记录可能的示例:

*--*--*--*--A [master]
             \
              *--*--*--* [myfeature]

请注意 master 没有 myfeature 没有的提交。 (没有提交被添加到 master 超过 myfeature 被分支的点,提交 A。)因此,默认情况下 Git 进行快进合并,这导致了这样的历史:

*--*--*--*--A--*--*--*--* [master,myfeature]

(因为mentioned by @tkausl,历史没有转移,只是修改了master。除非你后来删除了,myfeature应该没有改变。)

我的假设是您希望自己的历史看起来更像这样:

*--*--*--*--A------------* [master]
             \          /
              *--*--*--* [myfeature]

为此,您必须像这样进行合并:

git checkout master
git merge --no-ff myfeature

如果您想撤消快进合并并将其重做为 --no-ff,请执行:

git checkout master
git reset --hard A
git merge --no-ff myfeature

要找出 A 的提交哈希值,并确保确实如此,请检查以下输出:

git log --all --oneline --decorate --graph

您可能正在寻找 git rebase

当你变基时,git 本质上是想象你从主分支(例如 master)分支出来的时间比实际晚。它使 master 保持最新状态,然后自动将您分支的更改应用到此版本。

如果您一直在处理的文件在分支后也发生了变化,则可能会发生冲突,但变基过程允许您检查两组更改并选择正确的。

当您推送这些更改时,您将重写历史,因此您需要 git push --force。请小心 - 此命令可能很危险,因为它可能会毫不费力地覆盖您同事的代码等。

更多信息:https://git-scm.com/book/en/v2/Git-Branching-Rebasing