Git - 更新当前分支但不提交更改的方法

4
我看了很多关于这个话题的问题,它们都有不同的答案,让人感到困惑。
有些人说先提交你的更改,但我不想这样做。
我也在使用 Git Hub,但不理解如何与网站命令配合使用,例如创建拉取请求、比较跨分支、尝试更改基础等等……
我原以为只需将当前分支拖到右侧方块中,将 repo 主分支拖到左侧方块中,然后单击“合并分支”按钮即可,但之后还需要单击右上角的“同步”按钮,然后在网站上进行拉取请求……等等。
天啊,在 CVS 中,我只需点击更新,就可以将 Head 中的所有更改带到我的当前位置,就这样。
我猜有三个选项。使用 Git Hub、使用网站和/或使用命令行。如何简化这个过程?

跳进“sheesh”暗示中来;Git并不试图变得更加复杂,它只是更加强大,能够处理像“撤消”CVS更新(在CVS中很痛苦)或允许您逐个更改地解决冲突等问题。 - RJFalconer
你对想要的答案有任何偏好吗?(Git Hub 工具/网站/命令行)? - RJFalconer
你的分支已经被推到上游了吗?这将决定你应该如何继续;如果你使用rebase,你会得到一个更干净的历史记录(避免这种情况),但是你会重写历史记录,如果其他用户可以看到/从你的分支pull代码,那么你不应该这样做。 - RJFalconer
我喜欢Github,但它似乎不能做所有的事情。好像在使用它之后,你必须在网站上创建一个pull request。是这样吗?我还没有推送我的分支,我不想把提交的更改放在主分支中。我已经阅读了5个关于rebase的定义,但仍然不理解它。reset也一样。 - user2568374
rebase 命令会将你的分支从底部切断,然后将其放在其他地方的顶部。也就是说,它会重写历史记录,以假装你实际上是从其他某个点分支出来的。通常情况下,这用于使你的分支基于其父分支的最新版本构建。 - RJFalconer
reset 命令可以撤销你在 stage 中所做的更改。 - RJFalconer
4个回答

6
这取决于您的本地存储库相对于上游的状态。
  • If there are conflicts, then you are better off stashing your work before pulling your branch in. That can be accomplished thus:

    git add . && git stash save
    git pull
    git stash pop
    

    If you don't want to deal with merging, then you can rebase your branch instead, which doesn't require that you save off your work (but will prompt you for conflicts):

    git pull --rebase
    

    You'll have to deal with conflicts using your merge tool of choice.

  • If there are no conflicts, then you can simply pull the branch in.

    git pull
    
Github在这一切中的作用只是提供远程存储库,您可以从中拉取/推送。除非您没有设置远程,否则不必担心它;如果您需要设置远程存储库,我建议您查看他们精彩的文档。请参考Github文档了解如何设置远程存储库。

1
个人而言,我不喜欢使用 git pull(=git fetch & git merge),因为如果你经常在开发分支上进行拉取操作,最终会产生大量的合并提交记录。它确实有其用处,但如果你只是想获取未提交(尚未推送)的分支的最新更新,则应改用 rebase。 - RJFalconer
1
我已经添加了一个更新,其中包括使用git pull--rebase选项,这可以避免你所描述的情况。 - Makoto
我的理解是,pull会覆盖我当前分支中的更改? - user2568374
1
Git非常努力地尝试不覆盖您所做的任何更改。如果发生可能会发生这种情况,Git会以冲突的形式通知您。 - Makoto
上次我没有这样做,我的当前分支中的所有更改都消失了,或者可能我输入了rebase之类的命令,谁知道呢。我只想更新我的当前分支,并将更改提交到主分支。每个回答都有不同的答案,我害怕尝试其中一个。如果有共识,我会感到更加舒适。 - user2568374
1
抱歉,在这个上下文中我不知道“head fork”的意思。无论如何,如果你真的担心会丢失你的更改,请先将它们存储起来,然后将整个目录复制到其他地方,以便您可以使用备份进行实验。重要的是,在Git中没有一种方法可以做到你所描述的事情,也没有首选的方法,因为每个人都有自己的特点,所以你应该使用最舒适和最有意义的方法。 - Makoto

1

你的情况:

  • 你在一个分支上,可能存在于上游,该分支是从master的旧提交中分支出来的
  • 你没有未暂存的更改
  • 你有未提交的更改

"有人说先提交你的更改,但我不想这样做"

没有真正的理由不这样做; 直到你将其 push 到上游之前,它仍然是你的私有工作分支。

所以:

如果你还没有推送:

  • git commit -m WorkInProgress(或 git stash
  • git rebase master
  • 解决任何冲突
  • 如果你已经存储了,则 git stash pop

如果你已经推送了:

  • 确保你当前分支的提交是生产质量的
  • git stash
  • git pull(不会冲突,但会创建合并提交)
  • git stash pop

今天我学到了什么是“commit”和“push”。现在我意识到,我已经提交了我的更改到自己的分支,但还没有将它们推送到主干分支。话虽如此,我想我会使用顶部命令从主干分支更新我的基础分支?当我在线比较时,它说没有任何要比较的内容,但我可以看到这两个文件的差异! - user2568374
我真的要输入“WorkInProgress”吗?另外,我认为git pull会用尚未具有这些更改的head分支覆盖当前分支中的更改。这已经发生过一次了,谢天谢地我备份了。 - user2568374
“git pull”绝对不会这样做,即使您有未暂存的更改。它相当于“获取”(获取分支/标签的信息)+“合并”。您可以随意为正在进行中的提交命名。我通常使用“WIP”,然后稍后进行清理。因为您刚开始学习git,请坚持使用“stash”(原因:随着您在git中的进展,可能希望开始进行多个“stash”,这很快就会变得混乱。使用“commit”(实际更新分支)可以更容易地跟踪这些多个更改集)。 - RJFalconer

0

我想要将我在另一个分支提交的更改合并到我的当前分支中。这是我应该使用的吗? - user2568374
stash 只是“暂时性地将这些更改存储一下,让我在做某些事情时不受影响”。它不会影响任何分支的状态,只会影响磁盘上的文件。 - RJFalconer

0

你可以使用大多数IDE和一些工具提供的补丁,或者如果使用Intellij IDEA,则有一个类似于存储的构造,这些更改不会在git中持久化,而是在IDEA项目文件中。

但最终,在您当前的情况下,git stash是正确的选择。

从长远来看,最好还是多了解一些关于git的知识,因为它与CVS之间的差异之一是,现在您必须考虑两个阶段。您不能直接与远程github或其他内容进行交互。您的本地repo就像以前的“保存”按钮一样,远程repo与您的本地同步。即使在CVS中,如果您忘记保存,大多数系统也会发出警告...


我正在使用 Eclipse,但当我从上游获取时,它会说“一切都是最新的”,但我可以看到网站上头分支中的一个文件与我的基础分叉不同。 - user2568374
是的,因为那个文件不在你的本地分支上,所以没有被检索到。你不希望一个发布分支的“更新”从它分叉出来的开发主干中拉取工作。 - RJFalconer
在Eclipse中,“同步工作区”甚至显示尚未跟踪的文件,在Team->Git->同步设置中,您可以勾选“始终在同步之前获取...”。 - Alim Özdemir

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接