web-dev-qa-db-ja.com

Git Rebase Conflict:HEADは誰ですか?

リモートリポジトリにメインの開発ブランチがあるこのプロジェクトがあり、実験ブランチを含むフォークがあります。分岐にプッシュする前に、開発ブランチから実験ブランチにrebase変更する必要があります。次のようになります:

git checkout experimentalbranch
git fetch remoterepo
git rebase remoterepo/developmentbranch

この時までに、私は対立にぶつかりました。ただし、これらの変更のいずれにも精通していない(変更をすぐにマージしなかったため、数週間分の変更をリベースしています)。また、rebaseを行うのは初めてです。私はmergeにもっと慣れています。

メルドでは、通常は<<LOCAL||REMOTE>>mergeを表し、非常に直感的に聞こえます。しかし、rebaseでは、<<HEAD||COMMIT MESSAGE>>HEADとは誰ですか?それは開発ブランチのHEADですか?開発ブランチの最新のコードですか、それとも他の場所ですか?

51
Joseph

定義

このセクションでは、応答として求められる欠陥を確認します:

HEADは誰ですか?

HEADリポジトリの現在のコミット。ほとんどの場合、HEADはブランチ内の最新のコミットを指しますが、そうである必要はありません。HEADは単に「現在レポが指しているものを意味する」 at」。

HEADが参照するコミットがブランチの先端ではない場合、これは「detached head "。

開発ブランチのHEAD?

マージまたはリベースが行われた瞬間に、HEAD作成またはリファクタリングされたコミットを指すようにすぐに渡されますおよびしたがって、開発を指しますブランチ

git bashコミットがリストされているthe HEADの状況を見ることができます:

# Normal commit list
git log
# List of commit in a single line
git log --oneline 
# All commits graphically-linear (Recommended as alias)
git log --all --graph --decorate --oneline

練習

このセクションでは、_how_がユーザーによって実行されるいくつかのアクションを処理するのがわかります

ユーザーが次に進むとき:

# Command to change from the branch to the current one to experimentalbranch
git checkout experimentalbranch
# Command that traverses the typical workflow to synchronize its local repository with the main branch of the central repository (remoterepo)
git fetch remoterepo
# git fetch Origin
# git fetch Origin branch:branch
# With the command git rebase, you can take all the changes confirmed in one branch (remoterepo), and reapply them over another developmentbranch
git rebase remoterepo/developmentbranch

この時までに、私は対立にぶつかりました。ただし、これらの変更のいずれにも精通していません(変更をすぐにマージしなかったため、数週間分の変更をリベースしています)。また、リベースを行うのは初めてです。私はもっ​​とマージすることに慣れています。

ブランチの結合は2つの方法で行われます。

  • git merge

  • git rebase。

例では、次のツリーを使用します

* a122f6d (HEAD -> remoterepo) Commit END
* 9667bfb Commit MASTER
| * b9bcaf0 (Origin/experimentalbranch, experimentalbranch) Commit 3
| * 110b2fb Commit 2
| * e597c60 Commit 1
|/
* 0e834f4 (Origin/remoterepo) First commit

git merge

最もよく知られている形式はgit merge。各ブランチの最後の2つのスナップショットと両方の共通の祖先の間の3つのバンドへの融合を実行し、変更が混在する新しいコミットを作成します。

例えば ​​:

git checkout remoterepo
git merge experimentalbranch

それは私たちを作り出すでしょう:

*   003e576 (HEAD -> remoterepo) Merge branch 'experimentalbranch' in remoterepo
|\
| * b9bcaf0 (Origin/experimentalbranch, experimentalbranch) Commit 3
| * 110b2fb Commit 2
| * e597c60 Commit 1
* | a122f6d Commit END
* | 9667bfb Commit MASTER
|/
* 0e834f4 (Origin/remoterepo) First commit

git rebase

git rebase基本的には1つのブランチで確認された変更を1つずつ収集し、別のブランチでそれらを再適用する

リベースを使用すると、ローカルでリモートリポジトリにアップロードされていないコミットに適用されるたびに競合を回避できますが役立ちます。後者に注意を払わず、パートナーが影響を受ける変更を使用する場合は、これらのタイプの競合は通常修復が困難ですであるため、必ず問題が発生します。

例えば ​​:

git checkout remoterepo
git rebase experimentalbranch


* f8a74be (HEAD -> remoterepo) Commit END
* 4293e9d Commit MASTER
* b9bcaf0 (Origin/experimentalbranch, experimentalbranch) Commit 3
* 110b2fb Commit 2
* e597c60 Commit 1
* 0e834f4 (Origin/remoterepo) First commit

起源とは何ですか?

Origingitがメインのリモートリポジトリに与えるデフォルト名。ボックスには独自のリポジトリがあり、ほとんどの場合、自分と同僚全員がプッシュするリモートリポジトリにプッシュします。そのリモートリポジトリはほとんどの場合Originと呼ばれますが、そうである必要はありません。