Pertanyaan Batalkan pengerjaan salinan modifikasi dari satu file di Git?


Setelah commit terakhir, saya memodifikasi banyak file dalam copy pekerjaan saya, tetapi saya ingin membatalkan perubahan ke salah satu file tersebut, seperti pada meresetnya ke status yang sama seperti commit terbaru.

Namun, saya hanya ingin membatalkan perubahan copy pekerjaan hanya dari satu file saja, tidak ada yang lain dengannya.

Bagaimana aku melakukan itu?


1294
2018-03-28 05:09


asal


Jawaban:


Kamu dapat memakai

git checkout -- file

Anda dapat melakukannya tanpa -- (seperti yang disarankan oleh nimrodm), tetapi jika nama file tampak seperti cabang atau tag (atau pengenal revisi lainnya), mungkin akan membingungkan, jadi menggunakan -- paling baik.

Anda juga dapat memeriksa versi file tertentu:

git checkout v1.2.3 -- file         # tag v1.2.3
git checkout stable -- file         # stable branch
git checkout origin/master -- file  # upstream master
git checkout HEAD -- file           # the version from the most recent commit
git checkout HEAD^ -- file          # the version before the most recent commit

1786
2018-03-28 06:12



git checkout <commit> <filename>

Saya menggunakan ini hari ini karena saya menyadari bahwa favicon saya telah ditimpa beberapa commit yang lalu ketika saya memutakhirkan ke drupal 6.10, jadi saya harus mendapatkannya kembali. Inilah yang saya lakukan:

git checkout 088ecd favicon.ico

115
2018-03-28 10:25



Cukup gunakan

git checkout filename

Ini akan menggantikan nama file dengan versi terbaru dari cabang saat ini.

PERINGATAN: perubahan Anda akan dibuang - tidak ada cadangan yang disimpan.


101
2018-03-28 05:55



Jika file Anda sudah dipentaskan (terjadi ketika Anda melakukan git add dll setelah file tersebut diedit) untuk membatalkan perubahan Anda.

Menggunakan

git reset HEAD <file>

Kemudian

git checkout <file>

Jika belum dipentaskan, gunakan saja

git checkout <file>

51
2017-07-03 05:46



Jika Anda hanya ingin membatalkan perubahan commit sebelumnya ke satu file itu, Anda dapat mencoba ini:

git checkout branchname^ filename

Ini akan memeriksa file seperti sebelum komit terakhir. Jika Anda ingin melakukan beberapa commit lagi, gunakan branchname~n notasi.


15
2018-03-28 05:25



Saya selalu bingung dengan ini, jadi di sini adalah pengingat test case; katakanlah kita memiliki ini bash skrip untuk menguji git:

set -x
rm -rf test
mkdir test
cd test
git init
git config user.name test
git config user.email test@test.com
echo 1 > a.txt
echo 1 > b.txt
git add *
git commit -m "initial commit"
echo 2 >> b.txt
git add b.txt
git commit -m "second commit"
echo 3 >> b.txt

Pada titik ini, perubahan tidak dipentaskan di cache, jadi git status aku s:

$ git status
On branch master
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:   b.txt

no changes added to commit (use "git add" and/or "git commit -a")

Jika dari titik ini, kita lakukan git checkout, hasilnya adalah ini:

$ git checkout HEAD -- b.txt
$ git status
On branch master
nothing to commit, working directory clean

Jika sebaliknya kita lakukan git reset, hasilnya adalah:

$ git reset HEAD -- b.txt
Unstaged changes after reset:
M   b.txt
$ git status
On branch master
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:   b.txt

no changes added to commit (use "git add" and/or "git commit -a")

Jadi, dalam hal ini - jika perubahan tidak dipentaskan, git reset tidak ada bedanya, sementara git checkout menimpa perubahan.


Sekarang, mari kita katakan bahwa perubahan terakhir dari skrip di atas dipentaskan / di-cache, artinya kita juga melakukannya git add b.txt pada akhirnya.

Pada kasus ini, git status pada titik ini adalah:

$ git status
On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

    modified:   b.txt

Jika dari titik ini, kita lakukan git checkout, hasilnya adalah ini:

$ git checkout HEAD -- b.txt
$ git status
On branch master
nothing to commit, working directory clean

Jika sebaliknya kita lakukan git reset, hasilnya adalah:

$ git reset HEAD -- b.txt
Unstaged changes after reset:
M   b.txt
$ git status
On branch master
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:   b.txt

no changes added to commit (use "git add" and/or "git commit -a")

Jadi, dalam hal ini - jika perubahannya dipentaskan, git reset pada dasarnya akan membuat perubahan bertahap menjadi perubahan yang tidak berubah - sementara git checkout akan menimpa perubahan sepenuhnya.


7
2018-02-09 08:56



Saya mengembalikan file saya menggunakan id SHA, Apa yang saya lakukan adalah git checkout <sha hash id> <file name>


5
2018-05-22 20:39



Saya telah Melakukan melalui git bash:

(use "git checkout -- <file>..." to discard changes in working directory)

  1. Status Git. [Jadi kita telah melihat satu berkas diubah.]
  2. git checkout - index.html [saya telah berubah dalam file index.html:
  3. status git [sekarang perubahan itu dihapus]

enter image description here


3
2018-04-10 14:54



Jika Anda belum mendorong atau membagikan komitmen Anda:

git diff --stat HEAD^...HEAD | \
fgrep filename_snippet_to_revert | cut -d' ' -f2 | xargs git checkout HEAD^ --
git commit -a --amend

2
2018-04-30 19:45



Jawaban ini adalah untuk perintah yang diperlukan untuk membatalkan perubahan lokal yang ada di beberapa file tertentu dalam folder yang sama atau banyak (atau direktori). Jawaban ini secara khusus membahas pertanyaan di mana pengguna memiliki lebih dari satu file tetapi pengguna tidak ingin membatalkan semua perubahan lokal:

jika Anda memiliki satu atau lebih file, Anda dapat menerapkan perintah samne (git checkout -- file) ke   masing-masing file dengan daftar masing-masing lokasi mereka dipisahkan oleh   ruang seperti di:

git checkout -- name1/name2/fileOne.ext nameA/subFolder/fileTwo.ext

keberatan spasi abve antara name1 / name2 / fileOne.ext nameA / subFolder / fileTwo.ext

Untuk banyak file dalam folder yang sama:

Jika Anda perlu membuang perubahan untuk semua file dalam a   direktori tertentu, gunakan checkout git sebagai berikut:

git checkout -- name1/name2/*

Tanda bintang di atas melakukan trik untuk melepas semua file di lokasi tersebut di bawah nama1 / nama2.

Dan, demikian pula hal berikut dapat membatalkan perubahan semua file   banyak folder:

git checkout -- name1/name2/* nameA/subFolder/*

Sekali lagi keberatan ruang antara name1 / name2 / * nameA / subFolder / * di   atas.

Catatan: nama1, nama2, namaA, subfolder - semua nama folder contoh ini menunjukkan folder atau paket tempat file yang dimaksud mungkin berada.


2
2018-01-23 21:26



Bagi saya hanya yang satu ini yang berhasil

git checkout -p filename

enter image description here


1
2017-08-19 14:28