2012-05-27 12 views
7

Ich versuche, mit Git auf einem Github-Projekt zu beginnen. (Ich benutze CVS, SVN und hg seit Jahren; git ist schwer zu verstehen). Ich befolge die Anweisungen so präzise wie ich kann und kann es einfach nicht funktionieren lassen.Zusammenführen von Konflikten von Upstream aktualisieren

ich klonen mein gegabelt Projekt:

git clone [email protected]:davidgiven/linux-allwinner.git 

Wie empfohlen, füge ich ein ‚Upstream‘ Fernbedienung, die das Projekt verfolgt, die meine ein von gegabelt ist:

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

ich es holen:

git fetch upstream 

All dies funktioniert gut. Aber es ist eine Woche her, seit ich das Projekt gegabelt habe, und Upstream hat Änderungen vorgenommen. Also möchte ich diese Änderungen einbeziehen. Ich bin zur Zeit in der rechten Zweig --- allwinner-v3.0-android-v2 --- so ich fusionieren von stromaufwärts in meinem Zweig:

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

... und ich Konflikte zusammenführen.

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] 

Jetzt habe ich in nichts geprüft; Ich habe noch nicht mit der Arbeit begonnen, und mein Projekt ist völlig unberührt, seit ich es abgezweigt habe. Daher sollte es nicht möglich sein, Konflikte zu haben. Aber da sind einige; was ist los und wie repariere ich es?

Update:

git show-branch HEAD upstream/allwinner-v3.0-android-v2 zeigt dies, was ich zu sagen habe ich verstehe kein Wort von:

! [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 
+0

Klingt wie ein Fall, in dem Sie statt einer Zusammenführung eine Neupositionierung durchführen möchten. – ThiefMaster

+0

'git show-Zweig HEAD upstream/allwinner-v3.0-android-v2' könnte etwas interessantes ergeben. – georgebrock

+0

Ist das die komplette Ausgabe von 'show-branch'? Ich würde erwarten, dass es mit einer Zeile endet, die mit '++' – georgebrock

Antwort

11

Es könnte, dass stromaufwärts wurde neu geschrieben Geschichte (rebase, ändern , ...) - das sollten sie nicht tun, aber du wirst es nie erfahren.

Da Sie sagen, dass Sie keine lokalen Änderungen oder begeht, sollten Sie Ihr Repository durch das Zurücksetzen Ihrer Branche in einen sauberen Zustand zurückbringen:

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

(Dadurch werden alle lokalen Änderungen verwerfen und machen Commits des aktuellen HEAD nicht erreichbar!)


Das setzt voraus, oben, dass Sie (Kraft), um den neu zurückgesetzt Zustand Ihrer Niederlassung zu Ihrer Remote-Repository schieben, da Sie sonst die Konflikte wieder begegnen, wenn y Versuchen Sie, von origin zu ziehen.

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

Wenn Sie bereits selbst vor Ort begangen hatte, würden Sie (oder cherry-pick) Ihre Commits auf dem Upstream-Zweig rebase müssen, und dann eine Push-to-Ursprung. Auf diese Weise werden Sie Ihre lokale Geschichte der gleiche Art und Weise vorgeschalteten hat und Ihre Änderungen auf neu schreiben, das heißt:

git rebase --onto upstream/branch \ 
    last-original-upstream-commit-before-yours \ 
    your-branch 
+0

Ich habe das versucht. Leider hilft es nicht ... jetzt scheitert 'git push' und sagt mir, dass ich zuerst" git pull "machen muss; aber 'git pull' erzeugt die gleichen Merge-Fehler wie zuvor. Das ist eigentlich, was ich erwarten würde; Mein Verständnis ist, dass 'git reset' den aktuellen Zweig auf den angegebenen umstellt, so dass ich jetzt einfach eine Kopie von' upstream/allwinner-v3.0-android-v2' lokal als 'allwinner-v3.0-android 'ausgecheckt habe -v2'. Aber da die Konflikte zwischen "Ursprung/..." und "Upstream/..." geschehen, ändert sich nur das, wenn Konflikte auftreten. –

+0

@DavidGiven: git Push wohin? Es wird scheitern, da Ihr Push nicht mehr vorschnell ist. Sie erwähnen in Ihrer Frage, dass Sie nichts unternommen haben, also ist vielleicht ein einziger erzwungener Druck der richtige Weg? – knittl

+0

'git push Herkunft allwinner-v3.0-android-v2'. (Was im Übrigen genau dasselbe tut wie ein nackter "git push".) TBH, ich möchte wissen, was hier vorgeht; Ich habe noch keine Commits, aber ich möchte schon bald mit der Arbeit beginnen, also brauche ich eine allgemeine Lösung für den Fall, dass es wieder passiert, anstatt eine Nuke-Everything-Lösung. –

2

Der show-branch Ausgang bedeutet, dass upstream und HEAD haben jeweils noch zwei Commits seit ihren gemeinsamen Vorfahren (unter der Annahme, das ist die volle Ausgabe).(Siehe auch: http://www.gitguys.com/topics/git-show-branch-to-see-branches-and-their-commits/) Wenn Sie nichts selbst begangen haben, bedeutet das, dass upstream eine Rebase (oder etwas anderes, das die Geschichte geändert hat) verschoben hat. Da Sie nichts unternommen haben, ist die Antwort von knittl genau das, was Sie wollen.

Für was es wert ist, ich liebe auch git log --oneline --graph --decorate --remotes --branches dafür. Sie erhalten ein ASCII-Diagramm mit all Ihren Zweigen und Fernbedienungen, damit Sie sich vorstellen können, was dort passiert ist.

Verwandte Themen