Git: Як оновити / оформити один файл у майстра віддаленого походження?


362

Сценарій:

  1. Я вношу деякі зміни в один файл локально і запускаю git add, git commitіgit push
  2. Файл висувається у головне сховище віддаленого походження
  3. У мене є ще одне локальне сховище, яке розгорнуто через Capistrano методом "remote_cache" з цього віддаленого сховища
  4. Тепер я не хочу розгортати всю програму, а просто оновити / перевірити цей єдиний файл.

Це якось можливо при git? Я не зміг знайти нічого, що би спрацювало, і не зміг це зрозуміти. З SVN я щойно робив svn up fileі вуаля.


19
Ви можете подумати про зміну прийнятої відповіді на ту, яка насправді відповідає на ваше запитання. ;)
кроки

6
Після більш ніж 6 років я вважаю, що можна сміливо припускати, що цього не станеться @steps ...
Фелікс Ганьон-Греньє

З Git 2,23 (серпень 2019 року) так git restore -s origin/master -- path/to/file. Дивіться мою відповідь нижче .
VonC

Відповіді:


914

Це можна зробити (у розгорнутому сховищі)

git fetch
git checkout origin/master -- path/to/file

Вибір завантажить усі останні зміни, але він не помістить їх у поточний перевірений код (робоча область).

Каса оновить робоче дерево з певним файлом із завантажених змін ( origin/master).

Принаймні, це працює для мене для тих маленьких помилок друку, де дивно створювати гілку тощо, щоб просто змінити одне слово у файлі.


1
Супер зручно, це спрацювало чудово. Мені потрібно було отримати файл composer.json і запустити оновлення, перш ніж оновити решту сайту у виробництві. Якби я вручну поставив файли composer.json / lock на місце, коли я робив потяг, це було б конфліктом, кажучи, що файли вже існували. Роблячи це таким чином, git розпізнавав файли без скарги.
Девід

6
Це відповідь, яку я шукав.
javadba

20
@Mymozaaa Подвійний тире означає, що наступне - це ім'я файлу. Це не допустити, щоб git інтерпретував ваше ім'я файлу як гілку у нещасному випадку, якщо у вас є два з тим самим іменем.
Джоел Меллон

Проблема полягає в тому, що ви все ще отримуєте, і якщо це буде великий репо, це буде дорога операція. Я побоююсь, що єдиною альтернативою буде встановити gitweb на пульт та потім отримати доступ до нього, щоб отримати файл чи інший.
Крістіан Гетце

невелике запитання, після цього я переходжу до іншої машини, потім виконую ваші дії, перелічені вище, але потім git statusя бачу їх як Changes to be committed:- значить, мені потрібно їх знову зробити? (просто зауваживши, що я хотів оновити один недоторканий файл, але сам репо торкається в іншій машині)
Ricky Levi


19
git archive --format=zip --remote=ssh://<user>@<host>/repos/<repo name> <tag or HEAD> <filename> > <output file name>.zip

1
Це гарне рішення для репостів, клонованих через ssh, але, здається, це не підтримується через https: git archive --remote=https://github.com/git/git.git master:git/contrib/completion git-completion.bash | tar -x Повідомляє мені про помилку:fatal: Operation not supported by protocol.
Alderath

1
приємно поєднувався з tar: s --to-stdout,git archive --remote="gitolite3@<host>:<repo>" <tag> <file> | tar xf - --to-stdout
Puggan Se

18

З Git 2.23 (серпень 2019 року) та новою (ще експериментальною) командою git restore, видно в " Як скинути всі файли з робочого каталогу, але не з області інсценізації? ", Це було б:

git fetch
git restore -s origin/master -- path/to/file

Ідея така: git restoreстосується лише файлів, а не файлів та гілок, як git checkoutце робиться.
Дивіться " Збентеженийgit checkout ": саме там і git switchвходить)


codersam додає в коментарях :

у моєму випадку я хотів отримати дані з моїх верхніх течій (з яких я розщедрився).
Тому просто змінили на:

git restore -s upstream/master -- path/to/file

2
Яке полегшення, що ця команда, нарешті, існує ... Що раніше робили людині? Я відновлював всю справу і копіював потрібні мені окремі файли, але це було боляче.
Майк Мудрий

Це працювало для мене, але в моєму випадку я хотів отримати дані з моїх верхніх течій (з яких я розщедрився). Так що просто змінили наgit restore -s upstream/master -- path/to/file
coderSam

@coderSam Чим ви за цей відгук. Я включив ваш коментар у відповідь для більшої наочності.
VonC

8

Що ви можете зробити:

  1. Оновіть місцеве git repo:

    git fetch

  2. Створіть місцеве відділення та оформіть замовлення на ньому:

    git branch pouet && git checkout pouet

  3. Застосуйте потрібну комісію в цій гілці:

    git cherry-pick abcdefabcdef

    (abcdefabcdef - це sha1 зобов'язання, яке потрібно застосувати)


4
У бік вашого другого кроку також можна виконати в одній команді як git checkout -b pouet.
Грег Х'югілл

4
"pouet" - найкраща назва філії для цього прикладу.
Гусард

2

Або git приховування (якщо у вас є зміни) у відділенні, на якому ви працюєте, майстер оформлення замовлення, тягніть за останніми змінами, захопіть цей файл на робочий стіл (або весь додаток). Ознайомтесь з відділенням, на якому ви були Git stash повернеться до стану, в якому ви були, а потім виправіть зміни вручну або перетягніть його замінюючи файл.

Цей спосіб не дуже крутий, але він працює, якщо ви не можете зрозуміти нічого іншого.


-10

Я думаю, що я знайшов легкий злом.

Видаліть файл, який ви маєте в локальному сховищі (файл, який потрібно оновити, з останньої комісії на віддаленому сервері)

А потім зробіть git pull

Оскільки файл видалено, конфлікту не буде


Це видаляє всі можливі зміни, внесені до цього файлу локально, а також витягує всі інші файли, зокрема, те, що ОП не хоче робити.
legrojan

Замість оновлення віддаленої гілки, видалення локальної дуже погана ідея.
c0der512
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.