4

かなりうまく機能しているコードがあり、ブランチを作成して、仕事用コンピューターにいくつかの重要な変更を加えましたgit checkout -b messaging。部分的に完成した作業をコミットし、リモート リポジトリにプッシュしましたgit push origin messaging。家に帰ったので、git pull origin messagingそのブランチにいますが、マスターに戻りたいgit checkout masterのですが、次のメッセージが表示されます。

$ git checkout master
Switched to branch 'master'
Your branch is ahead of 'origin/master' by 1 commit.

messagingブランチ の変更によるすべてのファイルがそこにあります。git status私がブランチにいることを通知しますが、私のブランチは1 コミットmaster進んでいます。本当のorigin/masterマスターに到達するには、次の2 つの方法があることがわかりました。

git checkout origin/master
git checkout master~1

masterしかし、私はなぜこれが起こっているのか混乱しています。変更がブランチに影響を与えないようにしたいのですが、messagingその逆も同様です。私がやりたいのは、origin/master自分のローカルも作成し、別のブランチにmaster保持することです。自宅のコンピューターでコミットを指摘するmessagingために何か間違ったことをしましたか? この時点で、2 つの完全に分離されたブランチが必要です。mastermessaging

もっと考えてみると、git pull origin messaging私がmasterブランチにいたとき、それは実際にmessagingブランチをローカルにマージしましたmasterか? もしそうなら、私は何をすべきでしたか(ローカルmessagingブランチを作成してそれにプルしますか?)、どうすればローカルを変更masterなしでコミットに戻すことができmessagingますか?

4

3 に答える 3

6

ああgit pull…嫌いですgit pull; 人々を混乱させるだけです。どうしたの?

あなたが家に帰って走るまでgit pull origin messagingは大丈夫でした。実行すると、git branch -avそれが表示されorigin/masterorigin/messaging必要なコミットが示されます。

それで、プルは何をしましたか?

git pullgit fetchは、実際には a の後に aが続く単なるラッパーですgit mergegit fetchは簡単だ; originリモート ( で指定) がローカルに持っていないスナップショットに関する情報を収集しただけです。この場合、 という名前の 1 つのコミットとブランチorigin/messaging。次に、プルが実行され、ブランチが現在チェックアウトされているブランチ ( )git merge origin/messagingにマージされました。そのため、意図せずに変更を からにプルしました。origin/messagingmasterorigin/messagingmaster

物事を修正しましょう。まず、マスターをあるべき場所に戻します。

git checkout master
git reset --hard origin/master

messaging次に、リモート ブランチに基づいて呼び出されたローカル ブランチをチェックアウトします。

git checkout -b --track messaging origin/messaging

messagingこれで、ブランチで作業を続けることができます。

今後は避けることをお勧めしgit pullます。そのセマンティクスはわかりにくいと思います。代わりにgit fetch、マージまたはリベースで作業することに関心がある場合は、各ブランチを実行してから更新してください。

于 2013-05-23T01:42:32.187 に答える
5

あなた自身の質問に答えたと思います。のマニュアルからgit pull

リモート リポジトリからの変更を現在のブランチに組み込みます。デフォルトモードでは、git pull は git fetch の略で、その後に git merge FETCH_HEAD が続きます。

つまり、リモートの「メッセージング」ブランチをローカルのマスター ブランチにプルしたということです。

git pullこれは、それが何をしているのかを本当に理解せずに行うことの一般的な危険です。本質的には、 a の後に agit fetchが続きgit mergeますが、これは明らかにこの場合望んでいたものではありません。おそらくやりたいことのgit fetch後にはgit checkout --track origin/messaging. これにより、リモートを追跡するローカル ブランチが作成されますmessaging。これは、おそらく期待どおりの動作です。

Mark Longair によるこのブログ エントリgit pullは、明示的にフェッチしてマージする方がよい理由と、その理由をうまく説明しています。

于 2013-05-23T01:37:20.013 に答える
0

はい、あなたのプルはブランチのフェッチとマスターブランチへのマージを行いました。はい、その通りです。ローカル メッセージング ブランチを作成し、そこにプルする必要があります。

git fetch then git merge origin/XX何が起こっているかを 100% 明確にするために、2 つのコマンドに分割することを検討してください。

于 2013-05-23T01:43:09.670 に答える