2016-07-05 31 views
1

Ich habe 2 Filialen A und B. Beide haben sich vom Master mit vielen verschiedenen Commits divergiert, und der Master ist vorangegangen.Git: Code von einem Zweig zu einem anderen zu überschreiben

Was ich tun möchte, ist, alle Änderungen von B ersetzen mit A. das heißt, sollte B haben genau den gleichen Code wie A.

ich versucht, mit rebase/merge. Sogar -Xtheirs, während sie B umlenken, aber immer in eine Menge Konflikte geraten.

ich versuchte

git checkout B 
git reset --hard A 

wie in How to copy one branch to another regardless changes? gegeben, aber das gab this-

Your branch and 'origin/B' have diverged, 
and have 6603 and 1823 different commits each, respectively. 

Gibt es eine Möglichkeit ich den Code bekommen/verpflichtet von A nach B kopiert, ohne Konflikte? Bitte helfen Sie.

+0

'git checkout A && git ziehen --rebase && git push -f Ursprung B' (das ** überschreibt ** B mit A) –

+0

Wenn Sie nur Commits kopieren möchten, ist' git cherry-pick' eine Option –

+0

git pull --rebase && git push - Ursprung B -> Wird dies alle Änderungen von B in A bringen? – ghostCoder

Antwort

0

Wenn Sie wirklich versuchen, alle Ihre Änderungen von B zu verwerfen, was wie eine Verschwendung aussieht, können Sie die Aktualisierung des Verzweigungszeigers erzwingen.

git branch -f A B 
0
git checkout A -B B 

Kasse der Arbeitsbaum A, während es den Zweig Namen geben B. (Da B bereits vorhanden ist, -B (big B) ist erforderlich, um außer Kraft.)

Dies ist das Gleiche wie folgt aus:

# Checkout the branch 'A' and make the working tree reflect this 
git checkout A 

# Create/override a branch 'B' at this current position 
git checkout -B B 

Das Endergebnis ist, dass die Zweige (die praktisch nur Zeiger) 'A' und 'B' zeigen das genau gleiche Commit.

N.B. Das Endergebnis davon ist ziemlich genau das, was Sie mit git checkout B && git reset --hard A hatten.

Nun, da Sie mit dem origin/B besorgt zu sein scheinen diversed hat Nachricht, sind es zwei Dinge, die Sie an dieser Stelle tun:

  1. Sie origin/B aktualisieren können Ihren neuen B zu reflektieren durch Kraft drängen: (Dies ist vorgesehen, dass Sie nicht besorgt, dass Commits, die ursprünglich aufhören in origin/B waren zu existieren.)

    push origin B --force 
    
  2. Aus irgendeinem Grund können Sie Push nicht erzwingen (Fast-forward only server?) Oder Sie möchten den Commit-Verlauf beibehalten, der unter B lag - nur ihre Änderungen nicht. In diesem Fall ist es ein wenig mehr beteiligt: ​​(Dieser Anwendungsfall ist sehr selten, so bin ich nicht ganz sicher, das ist, was Sie nach):

    git checkout A --detach 
    git merge -s ours B 
    git checkout -B B 
    

    Das eine Verschmelzung macht verpflichten, dass Erlöse A, dass fusioniert B in A ohne tatsächlich irgendwelche Dateien zu ändern.Diese neue B kann normal geschoben werden, da es keine Abweichung von origin/B ist.

+0

aber ich möchte, dass A und B getrennt existieren. will nur alle code/commits von A nach B kopieren und überschreiben alles in B – ghostCoder

+0

@ghostCoder Sie werden separat existieren. Die zwei * Zweige * haben genau das gleiche "commits history" und Code. – antak

0

Ihr Befehl Ihre lokale Niederlassung B-A zurückgesetzt war alles in Ordnung.
Die Nachricht, die Sie erhalten, informiert Sie lediglich darüber, dass sich Ihr lokaler Zweig B von dem entfernten Zweig B unterscheidet.
Wenn dies wirklich das ist, was Sie tun möchten, machen Sie jetzt einen Druck von B auf origin/B mit git push -f origin B, wenn die Fernbedienung Force-Pushs erlaubt.
Aber seien Sie sich bewusst, dass Sie die veröffentlichte Geschichte umschreiben und Sie werden alle anderen Entwickler, die auf B arbeiten, verärgern, da sie sich von diesem manuell durch ihre Arbeit erholen müssen.