Git在退缩前拉动

时间:2016-10-13 22:43:58

标签: git git-rebase git-pull

所以我asked a question yesterday关于git中的变基,并得到了一些关于该怎么做的好答案。然而,当我继续进行时,我遇到了一些我不理解的问题。

快速概述:

我从另一个分支Branch2分支出来(Branch1)。 Branch1是远程的,并且在我从中分支之后有许多提交。所有这些提交都没有被压扁。与此同时,我开始在Branch2进行更改。现在我完成了我的更改,并且必须在Branch2之上重新Branch1

当我在git statusBranch2时,它列出了我已更改的所有文件(这似乎是正确的)。但是,当我执行git checkout Branch1git status时,它会再次列出相同的文件。我不明白这一点,我的印象是每个分支都像一个本地化的环境,并没有显示其他分支的变化。

另一件令我头晕目眩的事情是 - Branch1向前推进,因为我从中扩展了。在重新定位之前,我想更新Branch1的本地副本,以便我Branch2中的更改在Branch1的最新提交之后得到重新定位,因此我git checkout Branch1git pull。但是我得到了:

error: Your local changes to the following files would be overwritten by merge:
    file...
Please, commit your changes or stash them before you can merge.
Aborting

我不明白:

  1. 为什么branch2 git statusBranch1显示的更改已完成?
  2. 如果我在Branch1上提交并推送我的更改,那么git pull,我的提交将放在哪里,因为所有先前的提交,包括Branch1中我已经分支的提交被压扁了。

2 个答案:

答案 0 :(得分:1)

  

当我在Branch2中执行git状态时,它会列出我已更改的所有文件(这似乎是正确的)。

分支是指向提交的指针。 git status显示已修改但未提交的文件。也许它似乎对你而言,但在你提交更改之前,检查一个不同的分支是一个冒险的操作。

  

但是当我执行git checkout Branch1git status时,它会再次列出相同的文件。

这是因为未提交的更改不在分支中,这意味着它们不在存储库中。它们只在工作树中。

  

我不明白这一点,我的印象是每个分支都像一个本地化的环境,并没有显示其他分支的变化。

您的印象是正确的。

  

我头脑发热的另一件事是 - Branch1向前推进,因为我从中扩展了。

由于您未在Branch2中创建任何提交,因此从技术上讲,您没有"扩展"从中。 Branch2只是Branch1过去的提交,而不是真正的分支。在Branch2上提交您的更改,它将分支出来。

  

但是我得到了:

error: Your local changes to the following files would be overwritten by merge:
   file...
Please, commit your changes or stash 

嗯,git正努力不破坏你的工作。它建议你做什么才能安全。

如果我理解你的愿望,你必须运行的命令如下:

# go back to Branch2
git checkout Branch2

# commit the changes in Branch2
git add .
git commit

# get the recent commits on Branch1 from the remote server
# there is no need to merge them
git fetch origin

# rebase Branch1 on top of the remote version of Branch1
# git pull produces the same result if you didn't commit anything on Branch1
git rebase origin/Branch1 Branch1

# rebase the commit(s) you created in Branch2 on top of Branch1
git rebase origin/Branch1 Branch2

# now you are on Branch2 and Branch1 is in the past of Branch2
祝你好运!

答案 1 :(得分:0)

在切换回branch2之前,您似乎未能提交branch1。您将把所有未提交的数据传回上一个分支。您有两个选择:首先commit,运行git checkout .以撤消它们,或在切换前运行git stash