1

そのため、Git を理解するのに少し苦労しています。リモート(GitLabがインストールされている)リポジトリを使用して、Windowsで使用しています。git pull私はマスター ブランチのローカル コピーを持っており、ローカル コピーを最新の状態に保つために頻繁に 使用することにかなり熱心に取り組んでいます。

リリースの時間になったので (もちろん... これが起こるときではありませんか?)、変更した 1 つのファイルをチェックインしたいと思います。と入力しgit pullますが、エラーが発生します。

error: Your local changes to the following files would be overwritten by merge:
        <path>/filename.py
Please, commit your changes or stash them before you can merge.
Aborting

git diffがコミットしようとしているのと同じ場所で別の開発者がタイプミスを修正しました。簡単にgit status明らかにします:

Your branch is behind 'origin/master' by 4 commits, and can be fast-forwarded

そのため、途方に暮れて、変更をローカル リポジトリにコミットします。

git add <filename>
git commit -m "reworking to ignore logs"

今、私はgit pull成功することができます。

git pull origin master 
...
Merge made by the 'recursive' strategy
file1
file2...
....
<filename>
5 files changed, 1 insertion, 63 deletions...

これで、変更をリモート リポジトリにプッシュできるようになりました

git push

しかし:ここに私の質問があります。リモートサーバーでは、コミットと、コミット後にローカルによって引き起こされたファイルの変更の両方が表示されますpull。つまり、基本的にはリモート ファイルが変更されたことを示していますが、実際には、リモート リポジトリ にすでにあったものに変更されています。

上司が慌てて電話をかけてきて、なぜこれらの (他の 4 つの) ファイルをすべて変更したのかと尋ねてきましたが、私は答えることができません。最終的に 2 つのコミット (現在のコミットと変更前のコミット) をチェックアウトし、それらを比較して、違いは私の 1 つのファイルの変更のみであることを証明してから、両者とも安堵のため息をつきます。

私の質問は次のとおりです。何が欠けていますか? リモートで、リモートの HEAD に一致するようにファイルを変更したことを確認したいと Git が考える必要があるのはなぜですか? 私はingについてこの質問git squashを見てきましたがgit rebase、私にも役立つ可能性があることに気づきました。Git がこれを行う理由を誰かが理解するのを手伝ってくれますか? 「分散型」のパラダイム シフトを完全には受け入れていないように感じます。

4

2 に答える 2

1

どうやらあなた上司も同じことを見逃しており、上司はパニックに陥りがちです。:-)

コミットとして描画されたグラフィカルな形式で、これがあなたがしたことです。もともとあなたのレポにこれがありました:

... - F - G    <-- HEAD=master, origin/master

G当時の最新バージョンはどこにありますか。しかし、1 つのファイルにタイプミスがあるため、作業ツリーでそのファイルを編集して問題を修正しました。typo(以下では便宜上、ファイルに名前を付けます。)

$ vim typo
...

これはまだコミットしていませんが、変更しました。次に、次のことを行いました。

$ git pull

そのエラーメッセージが表示されました。

さて、いわば舞台裏では、が続くgit pullだけです。それでは、何が行われたかを見てみましょう。他の開発者は 4 つのコミットを行ったようです。それらをコミット ツリーのグラフィカルな表現に描画しましょう。git fetchgit mergegit fetch

              H - I - J - K      <-- origin/master
            /
... - F - G                      <-- HEAD=master

git merge他の誰かがファイルも変更したため、失敗しましたtypo

したがって、次のようにします。

$ git add typo
$ git commit -m "reworking to ignore logs"

HEADこれにより、現在のブランチ (指しているものは何でも) に新しいコミットが追加されます。これは明らかにmaster. これにより、次のようなコミット ツリーが得られます。

              H - I - J - K      <-- origin/master
            /
... - F - G ------------- L      <-- HEAD=master

git pullここで再び実行しますが、fetchこれもmerge. 今回は fetch には何も取得されません (と labelHを介したコミットは既にすべて処理されています)。次に、マージは commit ( ) を現在のブランチ にマージし、新しいマージ commit を作成します。Korigin/masterKorigin/mastermasterM

              H - I - J - K      <-- origin/master
            /               \
... - F - G ------------- L - M  <-- HEAD=master

git push結果がコミットされた場合、マージの最初の親としてM変更をマージし、2 番目の親としてそれらのコミットをマージします。LK

これは、たまたま生成されたものの実際の履歴でありM(Hobbs がコメントで指摘したように)、完全に正常です。ただし、あなた (およびパニックに陥った上司) は、別の履歴を作成することを好む場合があります。これは、 でコミットを取得したtypo に問題に気付いたふりをするものです。そのためには、コミット (上記の ) を「リベース」して の上に座らせます。HKLorigin/master

これは、git pull --rebase(この長いものを入力しているときに表示された Hobbs の回答のように)、または. この場合、コミットで変更のコピーを作成します(人々はこれを「commit」と綴ることがよくあります):git rebasegit fetchLL'

              H - I - J - K - L'
            /
... - F - G ------------- L

この時点で、もう commit する必要はありませんL— git の「reflogs」のために 90 日間ほどレポジトリに残りgit logますが、たとえば、通常の出力からは消えてしまいます — そのため、単に re-このグラフを少し描いて、 への行を省略しL、次のようにラベルを貼り付けます。

              H - I - J - K      <-- origin/master
            /               \
... - F - G                   L' <-- HEAD=master

これはまさにgit rebaseコマンド シーケンスの内容です。

$ git add typo
$ git commit -m "reworking to ignore logs"
$ git rebase

行っているだろう。(または、コミットしてから を使用することもできますgit pull --rebase。これにより、git は-then- の代わりにfetch-then-rebaseシーケンスを使用するようにfetchなりmergeます。この場合のように、フェッチするものが何もない場合は、単に実行中と同じgit rebaseです。)

于 2013-10-25T19:02:58.770 に答える
0

ローカルの変更があり、アップストリームの変更もあるブランチを使用している場合git pull、プルはアップストリームの変更をローカルの変更にマージし、マージ コミットを作成します。プッシュすると、このマージ コミットがサーバーに送信され、表示される履歴の一部になります。

役立つ可能性のある2つのこと:

  1. 履歴を正しく読み、実際には存在しない変更に慌てないように上司に教えてください。
  2. フィーチャー ブランチで使用git pull --rebaseして、アップストリームの変更を取り込み、プッシュされていないローカル作業をそれらの上にリベースします。これにより、歴史がよりきれいになり、歴史の書き換えに反対する純粋主義者を除いて、一般的に改善と見なされます。
于 2013-10-25T18:52:55.867 に答える