Wie können Sie Nicht-Index-Änderungen mithilfe des Stashs entfernen und anschließend wiederherstellen, ohne jemals Konflikte in Git zusammenzuführen?

Ich möchte in der Lage sein, meine Tests für mein Projekt mit dem aktuellen Stand des Index auszuführen und nicht festgeschriebene Arbeitsänderungen zu ignorieren (ich plane später, dies einem Pre-Commit-Hook hinzuzufügen). Ich habe jedoch Probleme, herauszufinden, wie die Nicht-Index-Änderungen auf eine Weise entfernt und dann wiederhergestellt werden können, die niemals Zusammenführungskonflikte verursacht. Ich brauche das, weil es von einem Skript ausgeführt wird, damit es den Repository-Status nicht ändert, wenn es fertig ist.

git stash --include-untracked --keep-index undgit stash pop In vielen Fällen führt dies zu Zusammenführungskonflikten, auch wenn zwischen den beiden Befehlen keine Änderungen vorgenommen wurden.

Zum Beispiel:

mkdir project; cd project; git init .;

# setup the initial project with file.rb and test.rb
cat > file.rb <<EOF
def func()
  return 42
end
EOF

cat > test.rb <<EOF
#!/usr/bin/env ruby
load './file.rb'
if (func() == 42)
  puts "Tests passed"
  exit 0
else
  puts "Tests failed"
  exit 1
end
EOF

chmod +x test.rb
git add .
git commit -m "Initial commit"

# now change file.rb and add the change
cat > file.rb <<EOF
def func()
  return 10 + 32
end
EOF
git add file.rb

# now make a breaking change to func, and don't add the change
cat > file.rb <<EOF
def func()
  return 20 + 32 # not 42 anymore...
end 
EOF

Von hier aus möchte ich die Tests anhand des aktuellen Status des Index ausführen und die nicht festgeschriebenen Änderungen wiederherstellen. Das erwartete Ergebnis ist, dass die Tests bestanden werden, da die Umbruchänderung nicht zum Index hinzugefügt wurde.

Die folgenden Befehle funktionieren NICHT:

git commit --include-untracked --keep-index
./test.rb
git stash pop

Das Problem tritt in der aufgit stash pop - Es tritt ein Zusammenführungskonflikt auf.

Die einzige andere Lösung, die mir in den Sinn kam, bestand darin, ein temporäres Commit durchzuführen, die verbleibenden Änderungen zu speichern und das Commit mit zurückzusetzengit reset --soft HEAD~und dann das Versteck wegwerfen. Das ist jedoch umständlich und ich bin nicht sicher, wie sicher es ist, in einem Pre-Commit-Hook zu laufen.

Gibt es eine bessere Lösung für dieses Problem?

Antworten auf die Frage(3)

Ihre Antwort auf die Frage