6

ブランチをチェックアウトし、ファイルを編集してコミットしました。その間、他の誰かが変更を同じファイルにプッシュしました。

git pull を実行すると、

First, rewinding head to replay your work on top of it...
Applying: add new line
Applying: create 1 conf
Using index info to reconstruct a base tree...
Falling back to patching base and 3-way merge...
Auto-merging <filename>
CONFLICT (add/add): Merge conflict in <filename>
Recorded preimage for '<filename>'
Failed to merge in the changes.
Patch failed at 0002 create 1 conf
When you have resolved this problem run "git rebase --continue".
If you would prefer to skip this patch, instead run "git rebase --skip".
To restore the original branch and stop rebasing run "git rebase --abort".

ファイル内の競合を手動で解決しようとしましたが、どのブランチにもいないことがわかりました。なぜこれが起こっているのか疑問に思っています。

git status
# Not currently on any branch.
# Untracked files:
4

2 に答える 2

6

これは正常です。ファイルを修正してから、指示に従うだけです。rebase通常は--continue.

問題を解決するには

  1. ファイルを編集して競合を解決する
  2. git checkout --ours -- <filenames>バージョンが適切であることがわかっている場合に実行する
  3. git checkout --theirs -- <filenames>彼らが良ければ実行します。

これらすべてを でフォローアップしgit add <filenames>ます。--oursand--theirsは、場合によっては、予想されるものと交換できることに注意してください。したがって、オプション 2 または 3 を使用する場合は、実際にチェックアウトされているファイルを確認してください。

で締めくくりgit rebase --continueます(これにより、コミットが行われます)。中止することにした場合はgit rebase --abort、git が「どのブランチにもいない」状態から抜け出せるように、必ず を使用してください。

于 2013-05-04T22:20:31.623 に答える
6

私はどの支店にもいません。なぜこれが起こっているのだろうか?

ヘッドレス状態から「頭を元に戻す」ための単なるレシピではなく、これに答えて何が起こっているのかを理解しようとしています:

  • フェッチ+マージではなくフェッチ+リベースを行うように指示するgit構成設定(pull.rebaseまたは)を使用しているようですbranch.*rebasegit pull
  • リベースは基本的に、リモート ブランチの先頭でローカル コミットを再生します (つまり、最新のコミットが何であれ)。これには次のことが含まれます。

    1. git は、最後のフェッチ/プル以降のローカル コミットのリストと、他の人がリモート ブランチで行ったコミットを取得します。
    2. あなたの場合、上記の2つが分岐していることがわかります(早送りのケースではありません)
    3. リモートブランチの最新リビジョンをチェックアウトします。注: リモート ブランチ自体はチェックアウトしません。つまり、禁止されているため、HEAD 参照を remote/yourbranch に設定しません (リモート リポジトリの読み取り専用ミラーであるため、コミットによって直接更新することはできません)。 . ヘッドレス状態とはそういうことだ。
    4. その時点でコミットを 1 つずつチェリー ピック (リプレイ) しようとし、これまでに行ったことと同様の履歴を構築します (差分/パッチの同じシーケンスを使用)。

      4.1. 手順 4 でパッチが競合した場合は、プロセスが一時停止して解決できるようになります。そのとき、自分が奇妙な状態にあることに気付きます。ステータスは「どのブランチにもありません」と表示され、gitk は最新のコミットで head ラベルを表示しません。したがって、gitが提案しているアドバイスに従ってください:競合を解決し、変更をステージング(git add)してから..

      4.2. git rebase --continueプロセスを再開します (コミットは必要ありません。git が自動的に行います)。Goto 4. または、変更をドロップする--skipか、あまりにも混乱し--abortている場合は、リベース部分の前の場所にすべてをリセットすることもできます。

    5. すべてのコミットが完了した後(つまり、パッチが適用された後)、これへの元のブランチ参照をリベースされた履歴の先端に移動(リセット)します(ところで、リプレイされた履歴を優先してコミットの元のシーケンスを放棄します)。真新しい HEAD (ブランチ参照) を自動的に取得します。頭のない状態は終わり、一瞬その状態にいたことに気付かないでしょう

たまたまgit config pull.rebase=falseor (branch.*rebase) を使用していた場合、この恐ろしい状態 (および潜在的により多くの競合) を回避できたはずですが、代わりに多くのマージでノイズの多い履歴を取得する可能性があります。(個人的には を渡すことで、1 回のプルでこれをオフにすることも可能--no-rebaseです。

リベースの詳細: http://git-scm.com/book/en/Git-Branching-Rebasing

お役に立てれば。

于 2013-05-05T00:10:12.557 に答える