10

githubプロジェクトでgitを使い始めようとしています。(私は何年もの間CVS、SVN、hgを使用しています; gitは頭を動かすのが難しいです)。私はできる限り正確に指示に従っており、単にそれを機能させることはできません。

フォークしたプロジェクトのクローンを作成します。

git clone git@github.com:davidgiven/linux-allwinner.git

推奨されているように、フォーク元のプロジェクトを追跡する「アップストリーム」リモートを追加します。

git remote add upstream https://github.com/amery/linux-allwinner.git

私はそれからフェッチします:

git fetch upstream

これはすべて正常に機能します。しかし、私がプロジェクトをフォークしてから1週間ほど経ち、アップストリームが変更を加えています。だから私はそれらの変更を取り入れたいと思います。私は現在正しいブランチにいます---allwinner-v3.0-android-v2---だから、アップストリームからブランチにマージします:

git merge upstream/allwinner-v3.0-android-v2

...そしてマージの競合が発生します。

CONFLICT (add/add): Merge conflict in arch/arm/mach-sun5i/pm/standby/common.h
CONFLICT (add/add): Merge conflict in arch/arm/mach-sun5i/pm/standby/Makefile
CONFLICT (add/add): Merge conflict in arch/arm/mach-sun5i/pm/standby.S
CONFLICT (add/add): Merge conflict in arch/arm/mach-sun5i/pm/Makefile
[etc]

今、私は何もチェックインしていません; 私はまだ仕事を始めていません、そして私がそれをフォークして以来、私のプロジェクトは完全に手つかずのままです。したがって、競合が発生する可能性はありません。しかし、いくつかあります。何が起こっているのですか、どうすれば修正できますか?

アップデート:

git show-branch HEAD upstream/allwinner-v3.0-android-v2これを示していますが、私は次の単語を理解していないと言わなければなりません:

! [HEAD] arm: sun3i: add getioaddr macro
 ! [upstream/allwinner-v3.0-android-v2] arm: sun3i: updated irq handling and machine_desc to 3.0
--
 + [upstream/allwinner-v3.0-android-v2] arm: sun3i: updated irq handling and machine_desc to 3.0
 + [upstream/allwinner-v3.0-android-v2^] arm: sunxi: renable early_printk in all _defconfig except crane's
+  [HEAD] arm: sun3i: add getioaddr macro
+  [HEAD^] arm: sun3i: add dummy machine type
4

2 に答える 2

15

アップストリームが履歴を書き換えた可能性があります(リベース、修正、…)–彼らはそれを行うべきではありませんが、あなたは決して知りません。

ローカルでの変更やコミットはないと言っているので、ブランチをリセットしてリポジトリをクリーンな状態に戻す必要があります。

git reset --hard upstream/allwinner-v3.0-android-v2

これにより、ローカルの変更が破棄され、現在のHEADのコミットに到達できなくなります!


上記は、ブランチの新しくリセットされた状態をリモートリポジトリに(強制的に)プッシュすることを前提としています。そうしないと、からプルしようとしたときに再び競合が発生しますorigin

git push origin +allwinner-v3.0-android-v2

すでにローカルでコミットしている場合は、アップストリームブランチの上にコミットをリベース(またはチェリーピック)してから、オリジンにプッシュする必要があります。そうすれば、アップストリームが行ったのと同じ方法でローカル履歴を書き直し、変更を上に適用します。

git rebase --onto upstream/branch \
  last-original-upstream-commit-before-yours \
  your-branch
于 2012-05-27T14:06:22.920 に答える
2

show-branch出力は、共通の祖先以降、それぞれに2つのコミットが追加されていることを意味します(これが完全な出力であると想定していますupstream)。HEAD(参照:http ://www.gitguys.com/topics/git-show-branch-to-see-branches-and-their-commits/ )自分で何もコミットしていない場合、それはアップストリームがプッシュされたことを意味しますリベース(または履歴を変更した他の何か)。あなたは何もコミットしていないので、knittlの答えはまさにあなたが望むものです。

それが価値があるので、私もこれが大好きgit log --oneline --graph --decorate --remotes --branchesです。すべてのブランチとリモコンを含むASCIIグラフが表示されるので、どこで何が起こったかを視覚化できます。

于 2012-05-27T15:41:26.327 に答える