Frage

Ich habe zwei Zweige, die anders sind genug, dass Rebasieren scheint nicht zu funktionieren - oder ich weiß nicht, wie es zu tun

.

Ich habe einen „öffentlichen“ Zweig mit einem Bündel von Dateien entfernt (mit Filter-Zweig). Auch wenn die meisten der Commits in Bezug auf die Deltas zusammenpassen, begehen die ids alle verschieden sind. Ich habe versucht, eine ganze Reihe von Methoden Veränderungen von meinem dev Zweig zu meinem öffentlichen Zweig zu ziehen ... Ich finde es schwer, es zu glauben kann, was ich will, es zu tun - aber ich vermute, ich weiß nur nicht, wie man Tu es. Auf jeden Fall funktioniert dies gut, aber scheint falsch.

git checkout dev
git format-patch --stdout last_sync_tag > catchup.mbox
git checkout public
git am catchup.mbox
git --skip # talks about a missing file
git --skip # talks about a missing file
git --skip # talks about a missing file

Irgendwelche Tipps oder Anregungen, die wahrscheinlich enthalten keine Dateien Filter Verzweigung Sie wollen nicht auf den öffentlichen Zweig (obwohl, wie bekommt man dann sie los?), Sind willkommen.

Mein Baum (s) zu buchen, mehr oder weniger wie folgt aus:

dev: a-b-c-d-e-f-g-h-i-j-k
pub: t-u-v-w-x

t ≅ a, U ≅ c, v ≅ d, w & sim; e, x ≅ g. i, j, k ist neuer Patches Ich mag würde zu über bewegen.

checkout pub
rebase --onto pub i  # I really expected this to work
War es hilfreich?

Lösung

Git cherry-pick Befehl könnte nützlich sein. Ich habe es nicht in Ihrer Situation verwendet, aber ich denke, es sollte funktionieren. Der einzige Schmerz ist, dass es nicht eine Reihe von Commits arbeiten über so ausgelegt, wenn Sie Skript wollen / automatisieren es Sie so etwas wie git rev-list verwenden müssten.

Noch einmal, ich habe nicht versucht, aber ein Bash-Skript wie diese können Sie einen guten Ausgangspunkt geben

git checkout public
for rev in $(git rev-list --reverse last_sync_tag..dev) ; do
   git cherry-pick $rev && git tag -f last_sync_tag $rev || exit 1
done

Andere Tipps

Sie halten Sie regelmäßig die Dateien auf Ihrem dev Zweig, die nicht auf öffentlich sind? Oder hängen sie gleich um?

Wenn Sie nicht zu Änderungen an sie neigen dazu, und du bist OK mit der Geschichte ein wenig umschreiben, was Sie können, ist tun arrangieren, um sie als ein einzige auf der Grundlage Ihrer öffentliche Niederlassung verpflichten erstellt zu haben; und verschmilzt, dass wieder in der Öffentlichkeit aber mit „es ours“ zu verhindern, dass sie tatsächlich zu bekommen. ( vorherige Antwort über git merge es unsere )

So etwas wie:

git checkout -b dev public
git am create-dev-only-files.patch
git checkout public
git merge -s ours dev
git checkout dev
# write more dev patches...
git checkout public
git merge dev
# and this should merge in the patches without bringing in the
#  dev-only files

Wenn Sie also dann nachfolgenden Änderungen auf Ihrem dev Zweig gemacht und fusionierte sie in der Öffentlichkeit, wenn Sie nicht diese Dateien zu ändern, die nicht auf öffentlich sind, alles andere wird einfach anzuwenden. Aber wenn die Menge der Dateien, die Sie mit den öffentlichen Änderungen zu unterdrücken wollen, könnte dies schwierig sein. Sie könnten versuchen, es Haken durch das Hinzufügen eines pre-commit zu verhindern, bestimmte Dateien unstage vor jedem begeht auf dem öffentlichen Zweig, zum Beispiel zu starten.

Weil Sie verwendet haben „filter-branch“ Sie gehen git zu haben, zu helfen, zu finden die richtigen verpflichten auf das Fütterungsmaterial auszuführen.

Ich werde hier erraten, aber vermutlich haben Sie eine ‚fast‘ gemeinsam begehen, welche zwei Versionen hat, den Kopf des öffentlichen Zweiges und den Platz auf Ihrem dev Zweig, dies entspricht verpflichten, (un-gefiltert). Rufen Sie den öffentlichen Kopf begehen <PH> und die Entwickler verpflichten, dass dies entspricht (vor der Filterung) <DevPH>.

mit dem dev Zweig ausgecheckt, wollen Sie so etwas wie dies zu tun:

git rebase --onto <PH> <DevPH>

Das sagt rebase die Patches von jedem Commit auf dem aktuellen Zweig seit <DevPH> eingeführt zu nehmen und diese Festschreibungen gelten <PH>. Ich denke, dass das ist, was Sie brauchen.

Edit:

Ihr Update auf die Frage zeigt, dass h auf den Kopf des öffentlichen Stromes auf dem dev Zweig entspricht und dass Sie auf dem dev Zweig auf den öffentlichen Zweig von hier an alles verpflanzen. Wenn dem so ist der Befehl

git rebase --onto pub h

Nun, wenn ich nicht ein fileit landet in .gitignore will. Wahrscheinlich ist es die Config nicht echter Code, damit es nicht gar Tracking benötigt.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top