Scenariusz:
- Wprowadzam pewne zmiany w jednym pliku lokalnie i uruchamiam
git add
,git commit
igit push
- Plik jest przekazywany do głównego repozytorium zdalnego źródła
- Mam inne lokalne repozytorium, które jest wdrażane za pośrednictwem Capistrano metodą „remote_cache” z tego zdalnego repozytorium
- Teraz nie chcę wdrażać całej aplikacji, ale po prostu zaktualizować / pobrać ten pojedynczy plik.
Czy jest to jakoś możliwe w przypadku git? Nie byłem w stanie znaleźć niczego, co by działało, ani nie byłem w stanie tego rozgryźć. Z SVN właśnie to zrobiłem svn up file
i voila.
git
git-checkout
foresth
źródło
źródło
git restore -s origin/master -- path/to/file
. Zobacz moją odpowiedź poniżej .Odpowiedzi:
Można to zrobić (we wdrożonym repozytorium)
Pobieranie pobierze wszystkie ostatnie zmiany, ale nie umieści go w bieżącym wypisanym kodzie (obszarze roboczym).
Kasa zaktualizuje drzewo robocze o konkretny plik z pobranych zmian (
origin/master
).Przynajmniej działa to dla mnie w przypadku tych małych drobnych poprawek literowych, w których dziwne jest tworzenie gałęzi itp. Tylko po to, aby zmienić jedno słowo w pliku.
źródło
git status
widzę je jakoChanges to be committed:
- co oznacza, że muszę je ponownie popełnić? (tylko zauważając, że chciałem odświeżyć pojedynczy nietknięty plik, ale samo repozytorium jest dotykane na innym komputerze)Dla mnie działał następujący kod:
źródło
źródło
git archive --remote=https://github.com/git/git.git master:git/contrib/completion git-completion.bash | tar -x
Daje mi komunikat o błędzie:fatal: Operation not supported by protocol.
tar
: s--to-stdout
,git archive --remote="gitolite3@<host>:<repo>" <tag> <file> | tar xf - --to-stdout
Z Git 2.23 (sierpień 2019 r.) I nową (wciąż eksperymentalną) komendą
git restore
, zobaczoną w „ Jak zresetować wszystkie pliki z katalogu roboczego, ale nie z obszaru przejściowego? ”, Byłoby to:Chodzi o to, że:
git restore
zajmuje się tylko plikami, a nie plikami i gałęziamigit checkout
.Zobacz „ Mylić przez
git checkout
”: to jest, gdziegit switch
wchodzi)codersam dodaje w komentarzach :
źródło
git restore -s upstream/master -- path/to/file
Co możesz zrobić to:
Zaktualizuj lokalne repozytorium git:
git fetch
Zbuduj lokalny oddział i dokonaj w nim kasy:
git branch pouet && git checkout pouet
Zastosuj zatwierdzenie, które chcesz w tej gałęzi:
git cherry-pick abcdefabcdef
(abcdefabcdef to sha1 zatwierdzenia, które chcesz zastosować)
źródło
git checkout -b pouet
.Lub git stash (jeśli masz zmiany) w gałęzi, w której się znajdujesz, kasie głównej, wyciągnij najnowsze zmiany, pobierz ten plik na pulpit (lub całą aplikację). Przejdź do gałęzi, w której byłeś. Skrytka Git stosuje się z powrotem do stanu, w którym byłeś, a następnie napraw zmiany ręcznie lub przeciągnij, zastępując plik.
Ten sposób nie jest zbyt fajny, ale zdecydowanie działa, jeśli nie możecie wymyślić nic innego.
źródło
Myślę, że znalazłem łatwy hack.
Usuń plik, który masz w lokalnym repozytorium (plik, który chcesz zaktualizować z ostatniego zatwierdzenia na serwerze zdalnym)
A potem zrób
git pull
Ponieważ plik zostanie usunięty, nie będzie konfliktu
źródło