Git rebase 删除了最近的更改?

Ind*_*igo 11 git

我有一个master分支和两个工作分支,a并且b. 分支b是从同一点创建的,a但涉及不同的文件(只有一个共享文件d.py)。科b刚被拉进master

                (a)   F---H-J----L---
                     /
(master)A--B--C--D--E--------------M
                     \            /
                 (b)  G----I----K
Run Code Online (Sandbox Code Playgroud)

在我a现在对分支Github 的拉取请求中说

此分支存在必须解决的冲突

使用 Web 编辑器或commandline解决冲突。

冲突文件

剪辑/ d.py

我以为我可以做显而易见的事情,git pull --rebase master最终得到一个看起来像这样的历史:

                             F---H-J----L--
                            /            
A--B--C--D--E--------------M
             \            /
              G----I----K
Run Code Online (Sandbox Code Playgroud)

然后合并到主人,一切都会很棒

                             F---H-J----L
                            /            \
A--B--C--D--E--------------M--------------N
             \            /
              G----I----K
Run Code Online (Sandbox Code Playgroud)

当我尝试合并时,这就是我得到的

You are currently rebasing branch 'bug/1500/Things' on '1234567'.
  (fix conflicts and then run "git rebase --continue")
  (use "git rebase --skip" to skip this patch)
  (use "git rebase --abort" to check out the original branch)

Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

    modified:   apps/a.py
    modified:   apps/b.py
    modified:   apps/c.py

Unmerged paths:
  (use "git reset HEAD <file>..." to unstage)
  (use "git add <file>..." to mark resolution)

    both modified:   apps/d.py
Run Code Online (Sandbox Code Playgroud)

我认为一切都会很棒。但后来我看了看,a.py意识到我所有的变化都来自 commits FHG并且L已经消失了。同为b.pyc.py等等。据我所知道的,唯一改变的是停留在底垫是在那些d.py这是两个分支之间共享文件。我中止了 rebase 并再次尝试,git rebase master但同样的事情发生了。

为什么 git 这样做?我怎样才能成功地重新调整我的提交以合并它?

小智 9

同样的事情发生在我身上。发生的情况是,您仍处于变基过程中,并且尚未完成,因此如果已提交,您最新的修改应该仍然可以。

变基将从您可能必须赶上的过去所有提交的开头返回(例如,如果您的其他开发人员在几天前进行了 10 次提交,您需要将其集成到您的应用程序中)。或者干脆不接受它或任何最适合您的应用程序的内容。

然后点击“+”将其添加/包含到您的本地分支中。(无需提交/推送,因为您只需将其带到本地分支即可完成工作)。

然后:

git rebase --continue
Run Code Online (Sandbox Code Playgroud)

然后一一检查与最新提交冲突的所有旧提交,直到找到最新的提交,一旦您看到那些看起来正常的最近修改,这应该会令人放心。


Leo*_*rea 6

如果 master 和您的a分支之间存在冲突,rebase 将在冲突存在的点处停止并期望您修复它。

首先,要获得分支的原始状态,您可以执行git rebase --abort. 这将撤消尝试的变基。

如果你仍然在 rebase 的中间,你可以做git diff看看冲突在哪里。您会在冲突文件中看到类似的内容

<<<<<<< HEAD
...
=======
....
>>>>>>> branch-a
Run Code Online (Sandbox Code Playgroud)

您可以通过选择要保留的代码并删除<<<< ===== >>>>>>>行来编辑文件以修复冲突。

完成文件和冲突的编辑后,您可以运行git add .,然后运行git rebase --continue. 变基将继续将您的提交移动到HEAD. 在任何时候,您可能会也可能不会遇到更多冲突。如果不这样做,您将看到 rebase 成功运行,然后您将能够将更改推送到您的分支。但是,由于您已经重新定位,因此您只能执行强制推送,因为您的提交引用将与远程上的提交引用发生变化。