我何时需要在“ git add,git commit”之前或之后执行“ git pull”?


93

正确的方法是什么?

git add foo.js
git commit foo.js -m "commit"
git pull
git push

要么

git pull
git add foo.js
git commit foo.js -m "commit"
git push

要么

git add foo.js
git pull
git commit foo.js -m "commit"
git push

UPD:

我忘了提及,在这种情况下,我使用的git add,要进行一次跟踪修改的文件。不要在存储库中包含全新文件。这会改变命令顺序吗?


Answers:


95

我认为最好的方法是:

存放本地更改:

git stash

将分支更新为最新代码

git pull

将本地更改合并到最新代码中:

git stash apply

添加,提交和推送更改

git add
git commit
git push

以我的经验,这是Git抵抗力最小的途径(无论如何在命令行上)。


4
您能解释一下为什么这样更好吗?这样可以避免什么问题?特别是为什么这比简单的commit> pull> push更好?(我觉得这可能是最好的答案,但目前没有足够的信息甚至不能被认为是一个好的答案。)
dallin

7
也许这太有趣了,但是我总是发现这种方法(在命令行而不是像sourcetree这样的方法)要容易得多。在大型团队中工作时进行提交然后拉动,总是会导致较大的合并冲突,因为git不太擅长将我的更改与传入的文件合并。通过存储,它使我能够拉出新更改,然后使用更新的代码作为向其添加更改的基础。处理冲突比较容易,因为它们对我来说很清楚(因为我的更改现在是冲突)。事后看来,这可能对我的情况来说更容易些。
johnjo,

1
因此,这听起来像是“如何吃一头大象?一次咬一口”。即将流程分为几个步骤以简化合并,以减少更改,甚至可能使更改更清晰。说得通。
达林

git add在这里必要吗?如果所有文件都已添加到暂存中!
Sharp Edge

如果您不使用该git stash怎么办?
亚伦·弗兰克

76

拉=提取+合并。

在合并之前,您需要提交已完成的操作。

所以提交后拉。


8
这是否意味着您最终为每次提交都做出了额外的提交,并使回购变得草率?同样,您的初始提交消息最​​终也会出现,并每次都带有合并注释。如果是这样,我倾向于使用@johnjo下面提到的隐藏方法。
星期一论文

3
@DanielM是的,合​​并有一个额外的提交(带有明确的默认提交消息)。但是,这确实是一件好事,因为它允许您签出上一次提交或同事的上一次提交或合并提交。如果您想避免这种情况,并且希望将提交内容放在同事的提交内容之后,则可以使用rebase代替merge。您可以使用git commit && git rebase或进行操作git pull --rebase
Arnaud Denoyelle

感谢您的提示,@ Arnaud。在阅读了许多不同的SO问题之后,这篇评论就做到了。当同事处理不同的文件时,我的首选方法是git pull分阶段进行更改,因为这是最自然的选择。尽管我意识到许多不同的工作流程都可以工作(存储也很不错),所以这可能只是一个问题。
nephewtom

51

我建议尽可能频繁地从远程分支中撤出,以最大程度地减少大型合并和可能的冲突。

话虽如此,我会选择第一种选择:

git add foo.js
git commit foo.js -m "commit"
git pull
git push

在拉取之前提交更改,以便在拉取期间将您的提交与远程更改合并。这可能会导致冲突,您可以在发生任何错误并且知道由于任何原因而不得不中止合并的情况下知道自己的代码已经提交,从而开始处理冲突。

我敢肯定有人会不同意我的看法,但我认为没有任何正确的方法来进行这种合并流程,只有对人最有效的方法才可以。


1
您能看到我对这个问题的更新吗?我忘了解释git add在我的示例中确切使用了什么。
格林

1
无论是新文件还是跟踪/修改后的文件,都不应有任何区别。仍然提交,然后拉。
Jasarien 2013年

7

我认为 git pull --rebase将本地最近的提交设置为您在某个时候没有的远程提交的最干净的方法。

这样一来,您不必每次都想开始进行更改时就拉动。


这也是我要做的,只是要指出的是,与Linus自己在合并阵营中,在这方面肯定有两个主要思想流派(围绕是否最好是在单个提交中解决冲突,还是在合并提交中一次) 。值得庆幸的是,该工具本身并不固执,因此可以使用它,但是最适合您和您的项目需求:-)
Luke Usherwood

3

您希望您的更改位于远程分支的当前状态之上。因此,可能您想在做出自己的承诺之前就做好准备。之后,再次推送您的更改。

只要与远程分支没有任何冲突,“脏”本地文件就不是问题。但是,如果存在冲突,合并将失败,因此在提交本地更改之前进行拉动没有风险或危险。


1
如Arnaud所述,将无法正常工作,要求您首先提交更改。
Jasarien

我的git似乎很高兴可以进行很多本地更改。当然,如果在远程分支上更改了相同的文件,则合并的合并部分将失败。当然,要创建适当的合并冲突,我必须先提交。因此,如果本地和远程更改的文件集不相交,则拉动然后提交是可以的。否则,git不会拉。尝试不造成任何损坏。
AlexE

当人们处理不同的文件时,这是我的首选选项,而我发现这是最自然的选择。
nephewtom
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.