2012-11-29 3 views
5

Angenommen, ich habe 2 Zweige, master und other.Git Master-Zweig hat einfach keine neuen Dateien nach der Zusammenführung

Ich gehe in den Zweig other, füge 2 Dateien, Commit und Push.

Jetzt gehe ich in den master Zweig, füge Dateien zu einem anderen Verzeichnis hinzu, und begehe sie. Dann fusioniere ich other.

Das Problem ist, dass die Dateien, die ich in other hinzugefügt habe, nicht angezeigt werden. Git sagt, es ist up-to-date, aber es ist nicht! Dateien fehlen.

Wie kann ich master erzwingen, um die Dateien in other hinzuzufügen oder irgendwie manuell hinzuzufügen?

Edit für Karl:

Ich habe folgendes zum besten meines Wissens, obwohl die Änderungen, die nicht nach oben zeigen mehrere Wochen alt sind. Ich habe gerade gemerkt, dass sie heute nicht da waren.

$ git branch 
*other 
master 
$ git add . 
$ git commit -m 'cool new features' 
$ git push origin other 
$ git checkout master 
$ git merge other 
$ git add . 
$ git commit -m 'merged cool new features from other' 
$ git push origin master 

Ich gehe auf Github, und die Dateien sind nicht da. Andere Dateien wurden festgeschrieben und angezeigt, aber zwei Ordner haben keinen übereinstimmenden Inhalt. Die Dateien existieren in other, aber nicht in master. Zur Klarstellung, die Dateien waren nicht neu. Aber ich dachte, dass das Zusammenführen zumindest Dateien zu master kopieren würde, wenn sie nicht existieren!

+0

Hallo, sind Sie sicher, dass Ihre Dateien übertragen wurden? Es gibt keinen Grund, warum Git sie während der Zusammenführung verstecken würde. Kannst du alle Befehle posten? (Das wird helfen, das Problem herauszufinden) –

+0

git add., Git commit -m 'etwas', git push, git checkout, git merge. Wahrscheinlich in jeder Reihenfolge jetzt und oft – AJcodez

+0

Und was passiert, wenn Sie 'git Status' in 'anderen' Zweig tun? –

Antwort

3

So:

[email protected]:~/stackoverflow$ git init . 
Initialized empty Git repository in /home/karl/stackoverflow/.git/ 
[email protected]:~/stackoverflow$ touch common_file_a 
[email protected]:~/stackoverflow$ touch common_file_b 
[email protected]:~/stackoverflow$ git add . 
[email protected]:~/stackoverflow$ git commit -m "commit common files" 
[master (root-commit) 89a5cd0] commit common files 
0 files changed 
create mode 100644 common_file_a 
create mode 100644 common_file_b 
[email protected]:~/stackoverflow$ git checkout -b other 
Switched to a new branch 'other' 
[email protected]:~/stackoverflow$ mkdir other 
[email protected]:~/stackoverflow$ touch other/other_file_a 
[email protected]:~/stackoverflow$ touch other/other_file_b 
[email protected]:~/stackoverflow$ git add . 
[email protected]:~/stackoverflow$ git commit -m "commit other files" 
[other 9c7409c] commit other files 
0 files changed 
create mode 100644 other/other_file_a 
create mode 100644 other/other_file_b 
[email protected]:~/stackoverflow$ git checkout master 
Switched to branch 'master' 
[email protected]:~/stackoverflow$ touch master_file_a 
[email protected]:~/stackoverflow$ touch master_file_b 
[email protected]:~/stackoverflow$ git add . 
[email protected]:~/stackoverflow$ git commit -m "commit master files" 
[master 3558768] commit master files 
0 files changed 
create mode 100644 master_file_a 
create mode 100644 master_file_b 
[email protected]:~/stackoverflow$ ls 
common_file_a common_file_b master_file_a master_file_b 
[email protected]:~/stackoverflow$ git merge other 
Merge made by the 'recursive' strategy. 
0 files changed 
create mode 100644 other/other_file_a 
create mode 100644 other/other_file_b 
[email protected]:~/stackoverflow$ ls 
common_file_a common_file_b master_file_a master_file_b other 
[email protected]:~/stackoverflow$ ls other 
other_file_a other_file_b 

Wenn Sie unterschiedliche Ergebnisse sind immer, bist du entweder einen Schritt fehlt, einen zusätzlichen Schritt irgendwo setzen, oder Sie irgendeine Art von Fehler bekommen Sie nicht zu sagen uns über, wie ein Merge-Konflikt. Wir haben keine Möglichkeit zu wissen, warum etwas so einfach funktioniert nicht für Sie, wenn Sie die genaue Befehle und die Ausgabe, die Sie bekommen, wie ich oben getan habe.

2

Es ist ein bisschen spät, aber für andere Benutzer, die diese Frage finden, werde ich eine Situation beschreiben, in der das von AJcodez beobachtete Problem auftreten wird. Wenn Sie eine git checkout master; git merge other machen, während oder nach dem Sie einige der neuen Dateien in master löschen (und möglicherweise vergessen Sie diese Tatsache) und später wieder eine git checkout master; git merge other tun, dann werden die "neuen" Dateien nicht wieder in master erscheinen, weil sie sind nicht neu. Beim Zusammenführen werden nur die Änderungen berücksichtigt, die sich auf die Merge-Base beziehen. Dies ist das jüngste Commit, das über beide Zweige erreicht werden kann. Während der zweiten Zusammenführung ist die Zusammenführungsbasis nicht die gleiche wie während der ersten Zusammenführung, die Zusammenführungsbasis während der zweiten Zusammenführung in dem beschriebenen Szenario ist die Festschreibung, die die Spitze von other während der ersten Zusammenführung war. Wenn other seitdem die neuen Dateien nicht geändert hat, dann ist das Löschen in master die aktuellste Änderung und daher wird das Löschen der neuen Dateien der Zustand nach der zweiten Zusammenführung sein.

Wenn das unbequem scheint, können Sie um ihn herum erhalten, indem einen temporären Zweig zu schaffen (nennen wir es merge_branch), Verschmelzung other hinein --squash verwenden, begehen sie in master Zusammenführung und den temporären Zweig zu löschen. Es ist wahrscheinlich nicht die ideale Lösung (z. B. müssen bereits aufgelöste Mischkonflikte erneut gelöst werden), aber dann ist die ursprüngliche Situation wahrscheinlich bereits das Ergebnis eines Fehlers.Hier ist, was ich in Code bedeuten:

git log other # find the commit where 'other' originally branched off 
git checkout -b merge_branch COMMIT_ID # go there & create branch 
# without '--squash', the following merge would simply be a fast-forward 
# merge and wouldn't solve our problem, because 'merge_branch' would then 
# point to the same commit as 'other' and so the later merge into 
# 'master' would produce the same unsatisfactory result. 
git merge --squash other # does not create a new commit by itself 
git commit # better add an explanation for what you did and why 
# 'merge_branch' now contains everything you did in 'other' since it 
# branched off from 'master', but squashed into a single new commit 
git checkout master 
git merge merge_branch 
git branch --delete merge_branch 
1

ich dieses Problem gelöst, indem leere Datei mit demselben Namen erstellen bei master-Zweig:

Angenommen, für den Zweig other enthält eine neue Datei newfile.txt, die nicht war fusioniert irgendwie zu master.

git checkout master 
touch newfile.txt 
git add newfile.txt 
git commit -m "create newfile.txt" 
git merge other 

Es ist irgendwie schmutzig, aber funktioniert.

Verwandte Themen