Jak mogę zatwierdzić tylko niektóre pliki?

259

Mam dwa projekty. Jeden to „oficjalny” projekt, a drugi to lekka modyfikacja (dodano kilka plików). Utworzyłem nowy oddział i dodałem do nich nowe pliki. Ale podczas programowania niektóre pliki wspólne dla obu gałęzi są zmieniane.

Jak mogę zatwierdzić tylko te pliki?

Czapki
źródło
Czy te dwa projekty są połączone z tym samym repozytorium git?
Oleksandr
Tak, jest to to samo repozytorium, ale nie chcę umieszczać mojego oddziału na serwerze
Nips
Dlaczego więc nie połączysz swojego nowego oddziału z mistrzem (lub innym oficjalnym oddziałem)
Oleksandr

Odpowiedzi:

261

Przypuszczam, że chcesz zatwierdzić zmiany w jednej gałęzi, a następnie pokazać te zmiany w drugiej gałęzi. W git nie powinieneś mieć żadnych zmian na HEAD podczas zmiany gałęzi.

Zatwierdzasz tylko zmienione pliki przez:

git commit [some files]

Lub jeśli masz pewność, że masz czyste miejsce postoju, możesz

git add [some files]       # add [some files] to staging area
git add [some more files]  # add [some more files] to staging area
git commit                 # commit [some files] and [some more files]

Jeśli chcesz udostępnić to zatwierdzenie w obu gałęziach, które robisz

git stash                     # remove all changes from HEAD and save them somewhere else
git checkout <other-project>  # change branches
git cherry-pick <commit-id>   # pick a commit from ANY branch and apply it to the current
git checkout <first-project>  # change to the other branch
git stash pop                 # restore all changes again
Alex
źródło
22
Aby dosłownie zatwierdzić tylko te pliki, nawet jeśli wprowadzono inne zmiany, należy użyć drugiego przykładu ( git commit [some files]który sugeruje --onlyzmianę). Pierwszy przykład ( git add [some files]po którym następuje git commit) spowoduje również zatwierdzenie wszelkich innych wprowadzonych zmian.
Lexikos
4
Byłbym pomocny, aby podać przykłady git commit [niektóre pliki]. jak w jaki sposób należy zastąpić [niektóre pliki], przecinek, białe znaki?
Claudiu Creanga
2
@claudiu zwykle elementy powłoki są rozdzielane spacjami. A jeśli zanurkujesz wystarczająco głęboko, możesz to zmienić Na cokolwiek
Alex
Jeśli możesz dodać kilka przykładów, ta odpowiedź będzie świetna.
Yamur
154

Uzyskaj listę plików, które chcesz zatwierdzić

$ git status

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

modified:   file1
modified:   file2
modified:   file3
modified:   file4

Dodaj pliki do inscenizacji

$ git add file1 file2

Sprawdź, co popełniasz

$ git status

Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

    modified:   file1
    modified:   file2

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

    modified:   file3
    modified:   file4

Zatwierdź pliki z komunikatem zatwierdzenia

$ git commit -m "Fixed files 1 and 2"

Jeśli przypadkowo popełnisz nieprawidłowe pliki

$ git reset --soft HEAD~1

Jeśli chcesz rozpakować pliki i zacząć od nowa

$ git reset

Unstaged changes after reset:
M file1
M file2
M file3
M file4
Abram
źródło
92

Możesz zatwierdzić niektóre zaktualizowane pliki, takie jak to:

git commit file1 file2 file5 -m "commit message"
Adriano Rivolli
źródło
30

Niektóre z nich wydają się „niekompletne”

Grupy ludzi NIE będą wiedzieć, czy powinny używać cytatów itp.

Dodaj 1 konkretny plik pokazujący również ścieżki lokalizacji

git add JobManager/Controllers/APIs/ProfileApiController.cs

Zatwierdź (pamiętaj, że zatwierdzenie jest tylko lokalne, nie wpływa na żaden inny system)

git commit -m "your message"  

Przekaż do zdalnego repozytorium

git push  (this is after the commit and this attempts to Merge INTO the remote location you have instructed it to merge into)

Inne odpowiedzi pokazują skrytkę itp., Którą czasem będziesz chciał zrobić

Tom Stickel
źródło
11

Jeśli pliki zostały już przemieszczone, po prostu usuń je ze sceny:

git reset HEAD [file-name-A.ext] [file-name-B.ext]

Następnie dodaj je krok po kroku z powrotem.

kajzer
źródło
11

Załóżmy, że dokonałeś zmian w wielu plikach, takich jak:

  • Plik 1
  • Plik 2
  • Plik 3
  • Plik 4
  • Plik 5

Ale chcesz zatwierdzić tylko zmiany w pliku File1 i File3.

Można to zrobić na dwa sposoby:

1.Zastosuj tylko te dwa pliki, używając:

git add file1 file2

następnie zatwierdzić

git commit -m "your message"

następnie pchnij

git push

2. Bezpośrednie zatwierdzenie

git commit file1 file3 -m "my message"

następnie pchnij

git push

Właściwie pierwsza metoda jest przydatna na wypadek, gdybyśmy regularnie modyfikowali pliki i wystawiali je na scenę -> Duże projekty, zazwyczaj projekty na żywo.
Ale jeśli modyfikujemy pliki, a nie je wystawiamy, możemy wykonać bezpośrednie zatwierdzenie -> Małe projekty

KamalDeep
źródło
Gdy nie podajesz nazwy pliku, jak sugerują drugie przykłady, git zakłada flagę poleceń dla tych argumentów --only. W takim przypadku byłoby to to samo polecenie git commit --only file1 --only file3 -m "my message"lub skrót , który można wykorzystać jako git commit -o file1 -o file3 -m "my message"Odwołanie: git-scm.com/docs/git-commit
użytkownik
0

Jest to proste podejście, jeśli nie ma dużo zmian w kodzie:

1. git stash
2. git stash apply
3. remove the files/code you don't want to commit
4. commit the remaining files/code you do want

Następnie, jeśli chcesz, aby kod, który usunąłeś (bity, których nie zatwierdziłeś) w oddzielnym zatwierdzeniu lub w innej gałęzi, wtedy będąc jeszcze w tej gałęzi, wykonaj:

5. git stash apply
6. git stash

W kroku 5, gdy już zastosowałeś ukrytą i zatwierdziłeś kod, który chciałeś w kroku 4, różnicę i niewyśledzenie w nowo zastosowanej skrytce jest tylko kodem, który usunąłeś w kroku 3 przed zatwierdzeniem w kroku 4.

W związku z tym krok 6 to ukryty kod, którego nie [chciałeś] zatwierdzić, ponieważ prawdopodobnie tak naprawdę nie chcesz stracić tych zmian, prawda? Tak więc nowa skrytka z kroku 6 może być teraz przypisana do tej lub dowolnej innej gałęzi, wykonując polecenie git stash dla właściwej gałęzi i zatwierdzając.

Oczywiście zakłada to, że wykonujesz kroki w jednym przepływie, jeśli skasujesz w dowolnym innym punkcie tych kroków, musisz zanotować oznaczenie skrytki dla każdego kroku powyżej (zamiast tylko podstawowej skrytki i zastosować najnowszą skrytkę).

James
źródło