2011-01-17 17 views
3

Ich habe einige Modifikationen an einem Ast (A) durchgeführt.Git - wird die Datei bewegt werden erkannt?

Ich entschied mich dann, einen brandneuen Zweig (B) basierend auf dem Stand meiner bestehenden Arbeitskopie zu erstellen und zu verpflichten und zu schieben.

Es gab eine Reihe von Dateien, die während meines früheren Refactorings verschoben wurden und daher nicht in der Versionskontrolle enthalten waren, da sie direkt in das Dateisystem verschoben wurden. Zufällig habe ich diese Dateien nicht zu Git hinzugefügt, bevor ich etwas getan habe und zu der neuen Verzweigung gedrängt habe (B).

Wenn ich jetzt diese Dateien hinzufüge und festlege und drücke, kann Git die Dateiverschiebeoperationen erkennen?

Antwort

5

Nicht, wenn sie als zwei separate Commits ausgeführt werden, weil die Dateien in einer Revision gelöscht wurden und eine neue Datei in der neuen Revision erstellt wurde. Wenn Sie die Umbenennung beibehalten möchten, sollten Sie eine git commit --amend tun, um Ihre Ergänzungen zum vorherigen Commit mit den Löschungen anzufügen.

+0

Danke - wie ich befürchtet – Ben

+0

Ich habe die Dateien hinzugefügt und führte ein * git commit --amend *. Das Commit hat zu Konflikten geführt, die ich mit meins gelöst habe (d. H. Das * add * anstelle des * delete *). GitHub zeigt den Dateiverlauf nicht mehr an. Wird die Bewegung der Datei erkannt, wenn ich in andere Zweige ziehe? Wenn dem so ist, kann ich mit dem vorübergehenden Verlust der sichtbaren Dateihistorie leben. – Ben

+0

Für Info: Ziehen in anderen Zweigen scheint nicht den sichtbaren Dateiverlauf wiederherzustellen. – Ben

0

Aber Git behandelt Objekte nach Inhalt und nicht nach Wegen. Das bedeutet, dass es keinen Unterschied macht, wenn Sie ein Objekt (eine Datei) verschieben oder ein Objekt löschen/hinzufügen. Es wird nur einmal in der git-Repo-Datenbank gespeichert.

0

Da Git keine Umbenennungsinformationen speichert, sondern eine Art Mechanismus zur Erkennung von Umbenennungen ausführt, sollten Sie in Ordnung sein. Siehe auch Handling renames: svn vs. git vs. mercurial

+0

Es scheint in meinem Fall, obwohl die Geschichte verfügbar sein könnte, scheint Datei Revisionshistorie von einem Tool wie GitHub verloren, vermutlich wegen der Anzahl oder Revisionen der Vergleich durchgeführt wird. – Ben

3

Der Umzug erkannt werden, wenn Sie einen direkten Vergleich zu tun, bevor sie zwischen und nach Revisionen, aber nicht, wenn Sie ein git log regelmäßig lesen:

[[email protected] testgit] echo hello world > foo 
[[email protected] testgit] git init 
gitInitialized empty Git repository in /home/bd/testgit/.git/ 
[[email protected] testgit] git add foo 
[[email protected] testgit] git commit -m 'test' 
[master (root-commit) 772dbe5] test 
1 files changed, 1 insertions(+), 0 deletions(-) 
create mode 100644 foo 
[[email protected] testgit] mv foo bar 
[[email protected] testgit] echo baz > quux 
[[email protected] testgit] git add quux 
[[email protected] testgit] git commit -a -m 'rm; add' 
[master 59dd10b] rm; add 
2 files changed, 1 insertions(+), 1 deletions(-) 
delete mode 100644 foo 
create mode 100644 quux 
[[email protected] testgit] git add bar 
[[email protected] testgit] git commit -m 'add' 
[master 823f70f] add 
1 files changed, 1 insertions(+), 0 deletions(-) 
create mode 100644 bar 

[[email protected] testgit] git log --stat -m 
commit 823f70fe50828204686a6a42a5e98dc9b258903b 
Author: Bryan Donlan <[email protected]> 
Date: Mon Jan 17 05:06:16 2011 -0500 

    add 

bar | 1 + 
1 files changed, 1 insertions(+), 0 deletions(-) 

commit 59dd10bfb72bb9005edecb1b7609978d82d21652 
Author: Bryan Donlan <[email protected]> 
Date: Mon Jan 17 05:05:58 2011 -0500 

    rm; add 

foo | 1 - 
quux | 1 + 
2 files changed, 1 insertions(+), 1 deletions(-) 

commit 772dbe5357253b533f8f2b9c64836dc09a51def4 
Author: Bryan Donlan <[email protected]> 
Date: Mon Jan 17 05:04:35 2011 -0500 

    test 

foo | 1 + 
1 files changed, 1 insertions(+), 0 deletions(-) 
### As you can see, a log doesn't show the move, but... 
[[email protected] testgit] git diff --stat 823f..772d -M 
bar => foo | 0 
quux  | 1 - 
2 files changed, 0 insertions(+), 1 deletions(-) 
### A direct comparison does 

Dieses Verhalten ist, weil git eigentlich nicht bewegen speichern/Informationen umbenennen - es rekonstruiert es, indem es den Inhalt addierter/entfernter Dateien vergleicht. Bei einem direkten Vergleich wird nur der Vorher/Nachher-Zustand betrachtet, also spielt es keine Rolle, wie genau die Dateien hinzugefügt/entfernt wurden. Mit git log vergleicht es jedoch paarweise Revisionen, so dass es immer nur entweder 'entfernt' oder 'hinzugefügt' sieht, nicht beides.

Wenn dies ein Problem ist, können Sie die Verwendung der Datei git rebase --interactive in Betracht ziehen, um das Hinzufügen der Dateien wieder in die Revision einzufügen, die sie gelöscht hat. Dies kann jedoch unwanted side effects haben, wenn die Revisionen mit dem schlechten Verlauf bereits von anderen heruntergeladen wurden.