Git mengkloning versi tertentu dari repositori jarak jauh

181

Saya mengkloning repositori git jarak jauh sekitar sebulan yang lalu. Repositori jarak jauh telah mengalami banyak perubahan dan sekarang menjadi tidak stabil. Sekarang saya perlu salinan repositori, versi yang identik dengan yang saya kloning sebulan yang lalu.

Bagaimana saya melakukan ini?

nandu
sumber
Kemungkinan duplikat stackoverflow.com/questions/3489173/…
Nicolas Raoul
Kemungkinan duplikat dari Bagaimana mengkloning git repositori dengan revisi / perubahan tertentu?
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

Jawaban:

242

Anda dapat "mengatur ulang" repositori Anda ke komit yang Anda inginkan (mis. 1 bulan yang lalu).

Gunakan git-reset untuk itu:

git clone [remote_address_here] my_repo
cd my_repo
git reset --hard [ENTER HERE THE COMMIT HASH YOU WANT]
Rui Carneiro
sumber
27
Anda tidak menyebutkannya, tetapi ini hanya akan mereset mastercabang, yang diperiksa secara default pada klon. Jika cabang selain mastercabang pengembangan utama Anda yang harus diperiksa terlebih dahulugit reset
Steve Folly
16
mengapa Anda tidak melakukan checkout sederhana dari komit yang diinginkan?
nemoo
10
Karena Anda akan berada dalam status "HEAD terlepas" setelah checkout ke komit tertentu.
Rui Carneiro
6
@RuiCarneiro akan lebih baik menggunakan git checkout -b new_branch hashAnda membuat cabang baru berdasarkan hash tanpa menyentuh cabang lainnya. Memindahkan kepala cabang yang ada dapat menyebabkan masalah ketika saatnya untuk mendorong sesuatu ke server jauh.
Loïc Faure-Lacroix
1
@YuriGhensev Jika komit sudah didorong ke cabang jauh Anda dapat melakukan git pull origin [branch]sebaliknya, afaik, yang hilang.
Rui Carneiro
94

Anda dapat menggunakannya secara sederhana

git checkout  commithash

dalam urutan ini

git clone `URLTORepository`
cd `into your cloned folder`
git checkout commithash

komit hash terlihat seperti ini "45ef55ac20ce2389c9180658fdba35f4a663d204"

M.Othman
sumber
9
Saya suka jawaban ini yang terbaik. Saya pikir git reset --hardharus dihindari, mendukung a git checkout commit-hash. A git reset --hardmenghapus bagian dari sejarah git yang terkadang tidak diinginkan.
Jordan Stewart
8
git inittidak perlu
Lautaro Paskevicius
37

Gunakan git loguntuk menemukan revisi yang ingin Anda kembalikan, dan catat hash komit. Setelah itu, Anda memiliki 2 opsi:

  1. Jika Anda berencana untuk melakukan sesuatu setelah revisi itu, saya sarankan Anda untuk checkout ke cabang baru:git checkout -b <new_branch_name> <hash>

  2. Jika Anda tidak berencana untuk melakukan apa pun setelah revisi itu, Anda dapat checkout tanpa cabang: git checkout <hash>- CATATAN: Ini akan menempatkan repositori Anda dalam keadaan 'terlepas kepala', yang berarti saat ini tidak terpasang ke cabang mana pun - maka Anda ' Saya akan memiliki beberapa pekerjaan tambahan untuk menggabungkan komitmen baru ke cabang aktual .

Contoh:

$ git log
commit 89915b4cc0810a9c9e67b3706a2850c58120cf75
Author: Jardel Weyrich <suppressed>
Date:   Wed Aug 18 20:15:01 2010 -0300

    Added a custom extension.

commit 4553c1466c437bdd0b4e7bb35ed238cb5b39d7e7
Author: Jardel Weyrich <suppressed>
Date:   Wed Aug 18 20:13:48 2010 -0300

    Missing constness.

$ git checkout 4553c1466c437bdd0b4e7bb35ed238cb5b39d7e7
Note: moving to '4553c1466c437bdd0b4e7bb35ed238cb5b39d7e7'
which isn't a local branch
If you want to create a new branch from this checkout, you may do so
(now or later) by using -b with the checkout command again. Example:
  git checkout -b <new_branch_name>
HEAD is now at 4553c14... Missing constness.

Dengan begitu Anda tidak kehilangan informasi apa pun, sehingga Anda dapat pindah ke revisi yang lebih baru ketika menjadi stabil.

jweyrich
sumber
2
Tetapi juga perhatikan bahwa Anda berada di kepala yang terpisah, yang OK untuk operasi hanya baca. Tetapi ketika Anda bermaksud untuk membuat perubahan mulai dari revisi ini, Anda perlu membuat cabang baru. Lihat sitaramc.github.com/concepts/detached-head.html untuk informasi lebih lanjut.
Rudi
@Rudi: Terima kasih. Itu hanya contoh untuk menunjukkan penggunaannya. Diperbarui untuk menyebutkannya.
jweyrich
Untuk kembali ke "status kerja", Anda dapat langsung git checkout developmengembangkan nama cabang Anda.
Steve Tauber
1
@SteveTauber dengan baik, seandainya Anda memiliki cabang yang berbeda yang berfungsi , mengubah ke cabang itu sudah cukup.
jweyrich
19

Jika versi yang Anda butuhkan adalah cabang atau tag, maka:

git clone -b branch_or_tag_name repo_address_or_path
buka clechu
sumber
2

Tidak seperti sistem kontrol versi terpusat, Git mengkloning seluruh repositori, jadi Anda tidak hanya mendapatkan file jarak jauh saat ini, tetapi juga seluruh riwayat. Repositori lokal Anda akan menyertakan semua ini.

Mungkin ada tag untuk menandai versi tertentu pada saat itu. Jika tidak, Anda dapat membuatnya sendiri secara lokal. Cara yang baik untuk melakukan ini adalah dengan menggunakan git logatau mungkin lebih secara visual dengan alat seperti gitk(mungkin gitk --alluntuk melihat semua cabang dan tag). Jika Anda dapat menemukan hash komit yang digunakan pada saat itu, Anda dapat menandai mereka menggunakan git tag <hash>dan kemudian memeriksanya dalam copy pekerjaan baru (misalnya git checkout -b new_branch_name tag_nameatau langsung dengan hash bukan nama tag).

Bruno
sumber
1

Anda dapat menyelesaikannya seperti ini:

git reset --hard sha

dimana shamis:85a108ec5d8443626c690a84bc7901195d19c446

Anda bisa mendapatkan sha yang diinginkan dengan perintah:

git log
Ghislain Zabatio
sumber
1

uploadpack.allowReachableSHA1InWant

Karena Git 2.5.0 variabel konfigurasi ini dapat diaktifkan di server, di sini permintaan fitur GitHub dan komit GitHub mengaktifkan fitur ini .

Bitbucket Server mengaktifkannya sejak versi 5.5+ .

Pemakaian:

# Make remote with 4 commits, and local with just one.
mkdir server
cd server
git init
touch 1
git add 1
git commit -m 1
git clone ./ ../local
for i in {2..4}; do
    touch "$i"
    git add "$i"
    git commit -m "$i"
done

# Before last commit.
SHA3="$(git log --format='%H' --skip=1 -n1)"
# Last commit.
SHA4="$(git log --format='%H' -n1)"

# Failing control without feature.
cd ../local
# Does not give an error, but does not fetch either.
git fetch origin "$SHA3"
# Error.
git checkout "$SHA3"

# Enable the feature.
cd ../server
git config uploadpack.allowReachableSHA1InWant true

# Now it works.
cd ../local
git fetch origin "$SHA3"
git checkout "$SHA3"
# Error.
git checkout "$SHA4"
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
sumber
0

Source tree yang Anda perlukan masih tersedia di repositori git, namun, Anda memerlukan SHA1 dari commit yang Anda minati. Saya berasumsi bahwa Anda bisa mendapatkan SHA1 dari klon saat ini yang Anda miliki?

Jika Anda bisa mendapatkan SHA1 itu, Anda bisa membuat cabang / reset di sana untuk memiliki repositori yang sama.

Perintah sesuai jawaban Rui

gpampara
sumber
0

Mungkin git resetmemecahkan masalah Anda.

git reset --hard -#commit hash-

sumber