Sie können Ihren Upstream-Zweig dev
mit einem benutzerdefinierten Zusammenführungstreiber "keepTheirs" zu Ihrem Zweig zusammenführen :
Siehe " " git merge -s theirs
"erforderlich - aber ich weiß, dass er nicht vorhanden ist ".
In Ihrem Fall .gitattributes
wäre nur eines erforderlich und ein keepTheirs
Skript wie:
mv -f $3 $2
exit 0
git merge --strategy=theirs
Simulation # 1
Wird als Zusammenführung angezeigt, wobei Upstream das erste übergeordnete Element ist.
Jefromi erwähnt (in den Kommentaren) das merge -s ours
, indem er Ihre Arbeit im Upstream (oder in einem temporären Zweig, der vom Upstream ausgeht ) zusammenführt und dann Ihren Zweig schnell zum Ergebnis dieser Zusammenführung vorspult:
git checkout -b tmp origin/upstream
git merge -s ours downstream # ignoring all changes from downstream
git checkout downstream
git merge tmp # fast-forward to tmp HEAD
git branch -D tmp # deleting tmp
Dies hat den Vorteil, dass der vorgelagerte Vorfahr als erstes übergeordnetes Element aufgezeichnet wird, sodass die Zusammenführung "diesen veralteten Themenzweig absorbieren" bedeutet, anstatt "diesen Themenzweig zu zerstören und durch vorgelagerten zu ersetzen" .
(Edit 2011):
Dieser Workflow wurde in diesem Blog-Beitrag vom OP gemeldet :
Warum will ich das wieder?
Solange mein Repo nichts mit der öffentlichen Version zu tun hatte, war das alles in Ordnung, aber da ich jetzt die Möglichkeit haben möchte, mit anderen Teammitgliedern und externen Mitwirkenden auf WIP zusammenzuarbeiten, möchte ich sicherstellen, dass meine öffentlichen Zweige vorhanden sind Zuverlässig für andere, um abzweigen und abziehen zu können, dh keine Rebase und Reset mehr für Dinge, die ich auf das Remote-Backup verschoben habe, da es jetzt auf GitHub und öffentlich ist.
So bleibt mir, wie ich vorgehen soll.
In 99% der Fälle wird meine Kopie in den Upstream-Master verschoben, daher möchte ich meinen Master bearbeiten und die meiste Zeit in den Upstream verschieben.
Aber hin und wieder wird das, was ich habe wip
, durch das, was in den Upstream fließt, ungültig und ich werde einen Teil von mir aufgeben wip
.
An diesem Punkt möchte ich meinen Master wieder mit dem Upstream synchronisieren, aber keine Commit-Punkte auf meinem öffentlich gepushen Master zerstören. Dh ich möchte eine Zusammenführung mit Upstream, die mit dem Änderungssatz endet, der meine Kopie mit Upstream identisch macht .
Und genau das git merge --strategy=theirs
sollte es tun.
git merge --strategy=theirs
Simulation # 2
Shows als Zusammenführung, mit unserer als erstem Elternteil.
(vorgeschlagen von jcwenger )
git checkout -b tmp upstream
git merge -s ours thebranch # ignoring all changes from downstream
git checkout downstream
git merge --squash tmp # apply changes from tmp but not as merge.
git rev-parse upstream > .git/MERGE_HEAD #record upstream 2nd merge head
git commit -m "rebaselined thebranch from upstream" # make the commit.
git branch -D tmp # deleting tmp
git merge --strategy=theirs
Simulation # 3
Dieser Blog-Beitrag erwähnt :
git merge -s ours ref-to-be-merged
git diff --binary ref-to-be-merged | git apply -R --index
git commit -F .git/COMMIT_EDITMSG --amend
Manchmal möchten Sie dies tun, und zwar nicht, weil Sie "Mist" in Ihrer Geschichte haben, sondern weil Sie möglicherweise die Basis für die Entwicklung in einem öffentlichen Repository ändern möchten, in dem eine erneute Basierung vermieden werden sollte .
git merge --strategy=theirs
Simulation # 4
(gleicher Blogbeitrag)
Wenn Sie alternativ die lokalen Upstream-Zweige schnell vorspulbar halten möchten, besteht ein möglicher Kompromiss darin, mit dem Verständnis zu arbeiten, dass für Sid / Instable der Upstream-Zweig von Zeit zu Zeit zurückgesetzt / neu basiert werden kann (basierend auf Ereignissen, die letztendlich aus sind Ihrer Kontrolle auf der Seite des vorgelagerten Projekts).
Dies ist keine große Sache, und wenn Sie mit dieser Annahme arbeiten, ist es einfach, den lokalen Upstream-Zweig in einem Zustand zu halten, in dem nur Aktualisierungen im Schnellvorlauf erforderlich sind.
git branch -m upstream-unstable upstream-unstable-save
git branch upstream-unstable upstream-remote/master
git merge -s ours upstream-unstable
git diff --binary ref-to-be-merged | git apply -R --index --exclude="debian/*"
git commit -F .git/COMMIT_EDITMSG --amend
git merge --strategy=theirs
Simulation # 5
(vorgeschlagen von Barak A. Pearlmutter ):
git checkout MINE
git merge --no-commit -s ours HERS
git rm -rf .
git checkout HERS -- .
git checkout MINE -- debian # or whatever, as appropriate
git gui # edit commit message & click commit button
git merge --strategy=theirs
Simulation # 6
(vorgeschlagen von demselben Michael Gebetsroither ):
Michael Gebetsroither mischte sich ein und behauptete, ich hätte "geschummelt";) und gab eine andere Lösung mit untergeordneten Sanitärbefehlen:
(Es wäre kein Git, wenn es nicht nur mit Git-Befehlen möglich wäre. Alles in Git mit Diff / Patch / Apply ist keine echte Lösung.)
# get the contents of another branch
git read-tree -u --reset <ID>
# selectivly merge subdirectories
# e.g superseed upstream source with that from another branch
git merge -s ours --no-commit other_upstream
git read-tree --reset -u other_upstream # or use --prefix=foo/
git checkout HEAD -- debian/
git checkout HEAD -- .gitignore
git commit -m 'superseed upstream source' -a
git merge --strategy=theirs
Simulation # 7
Die notwendigen Schritte können beschrieben werden als:
- Ersetzen Sie Ihren Arbeitsbaum durch Upstream
- Übernehmen Sie die Änderungen auf den Index
- Fügen Sie Upstream als zweites übergeordnetes Element hinzu
- Verpflichten
Der Befehl git read-tree
überschreibt den Index mit einem anderen Baum, um den zweiten Schritt auszuführen , und verfügt über Flags zum Aktualisieren des Arbeitsbaums, um den ersten Schritt auszuführen . Beim Festschreiben verwendet git SHA1 in .git / MERGE_HEAD als zweites übergeordnetes Element, sodass wir dieses füllen können, um ein Zusammenführungs-Festschreiben zu erstellen. Daher kann dies erreicht werden mit:
git read-tree -u --reset upstream # update files and stage changes
git rev-parse upstream > .git/MERGE_HEAD # setup merge commit
git commit -m "Merge branch 'upstream' into mine" # commit