「gitadd、gitcommit」の前または後に「gitpull」を実行する必要があるのはいつですか。


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追跡および変更されたファイルをステージングするために使用することを忘れました。リポジトリに新しいファイルを含めないでください。これにより、コマンドの順序が変わりますか?


回答:


95

これを行うための最良の方法は次のとおりだと思います。

ローカルの変更を隠します:

git stash

ブランチを最新のコードに更新します

git pull

ローカルの変更を最新のコードにマージします。

git stash apply

変更を追加、コミット、プッシュします

git add
git commit
git push

私の経験では、これはGitでの抵抗を最小限に抑えるためのパスです(とにかくコマンドラインで)。


4
これが優れている理由を説明できますか?これはどのような問題を回避しますか?特に、これが単純なコミット>プル>プッシュよりも優れているのはなぜですか?(これが最良の答えかもしれないと思いますが、今のところ、良い答えとさえ見なされるのに十分な情報がありません。)
dallin 2018

7
おそらくこれは逸話的すぎたのかもしれませんが、私は常にこのアプローチ(sourcetreeのようなものではなくコマンドラインで)がはるかに簡単であることに気づきました。大規模なチームで作業しているときにコミットしてからプルすると、gitはファイルへの変更を受信ファイルにマージするのがあまり得意ではなかったため、常に大きなマージの競合が発生します。隠しておくことで、新しい変更をプルし、更新されたコードをベースとして使用して変更を追加することができました。競合が私にとってより明確であったため、競合への対処はより簡単でした(私の変更は現在競合であったため)。後から考えると、私の状況ではもっと簡単だったのかもしれません。
johnjo 2018

1
だから「象はどうやって食べるの?一口ずつ」みたいな感じです。つまり、プロセスをさらにいくつかのステップに分割して、マージを簡素化し、変更を少なくし、場合によってはより明確にします。理にかなっています。
ダリン・

ここでgitaddは必要ですか?すべてのファイルがすでにステージングに追加されている場合!
シャープエッジ

使用していない場合はどうgit stashですか?
アーロンフランケ

76

プル=フェッチ+マージ。

マージする前に、行ったことをコミットする必要があります。

したがって、コミット後にプルします。


8
これは、コミットするたびに追加のコミットを行い、リポジトリをだらしなくすることになるということですか?また、最初のコミットメッセージの後に、毎回マージコメントが続きます。もしそうなら、私は@johnjoによって下記のstashメソッドを使用する傾向があります。
月曜日の紙2016年

3
@DanielMはい、マージには追加のコミットがあります(明示的なデフォルトのコミットメッセージがあります)。ただし、これは、最後のコミット、同僚の最後のコミット、またはマージコミットをチェックアウトできるため、非常に良いことです。それを避けたい場合、そして同僚のコミットの後にコミットを配置したい場合は、のrebase代わりにできますmergegit commit && git rebaseまたはのいずれかでそれを行うことができますgit pull --rebase
Arnaud Denoyelle 2016年

先端をありがとう、@ Arnaud。多くの異なるSOの質問を読んだ後、このコメントはそれを作りました。同僚がさまざまなファイルで作業しているときに私が好むオプションはgit pull、変更をステージングした後です。これが最も自然なことです。私は多くの異なるワークフローが機能することを認識していますが(スタッシュも素晴らしいです)、それはおそらく好みの問題です。
甥2017

51

大規模なマージや競合の可能性を最小限に抑えるために、できるだけ頻繁にリモートブランチからプルすることをお勧めします。

そうは言っても、私は最初のオプションを選択します。

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

プルする前に変更をコミットして、プル中にコミットがリモートの変更とマージされるようにします。これにより競合が発生する可能性があり、問題が発生した場合にコードが既にコミットされていることを認識して対処を開始でき、何らかの理由でマージを中止する必要があります。

誰かが私に同意しないと確信していますが、このマージフローを実行する正しい方法はないと思います。人々にとって最も効果的方法だけです。


1
質問に対する私の更新をご覧いただけますか?git add私の例では、forが正確に使用されていることを説明するのを忘れました。

1
それが新しいファイルであるか、追跡/変更されたファイルであるかにかかわらず、違いはありません。それでもコミットしてからプルします。
jasarien 2013

7

git pull --rebase特定の時点で持っていないリモートコミットの上にローカルで最近のコミットを設定する最もクリーンな方法だと思います。

したがって、この方法では、変更を開始するたびにプルする必要はありません。


これも私がしていることですが、これについては間違いなく2つの主要な考え方があります(個々のコミット間での競合を修正するのが最善か、マージコミットで1回修正するのが最善かを中心に)、マージキャンプでのLinus自身。ありがたいことに、ツール自体は意見が分かれていないので、それを使用してください。ただし、あなたとあなたのプロジェクトのニーズに最適です:-)
LukeUsherwood19年

3

リモートブランチの現在の状態の上に変更を配置する必要があります。ですから、おそらくあなたは自分自身をコミットする直前に引っ張りたいと思うでしょう。その後、変更をもう一度プッシュします。

リモートブランチとの競合がない限り、「ダーティ」なローカルファイルは問題になりません。ただし、競合がある場合、マージは失敗するため、ローカルの変更をコミットする前にプルするリスクや危険はありません。


1
Arnaudが述べたように、機能しません。プルするには、最初に変更をコミットする必要があります。
jasarien 2013

私のgitは、多くのローカルな変更を加えて喜んで引っ張っているようです。もちろん、リモートブランチで同じファイルが変更された場合、プルのマージ部分は失敗します。適切なマージの競合を作成するには、最初にコミットする必要があります。したがって、ローカルおよびリモートで変更されたファイルのセットが互いに素である場合、プルしてからコミットすることは問題ありません。そうしないと、gitはプルしません。試してみてもダメージはありません。
AlexE 2013

これは、人々がさまざまなファイルで作業しているときに私の好みのオプションであり、最も自然なことだと思います。
甥2017
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.