Cabang dari komit sebelumnya menggunakan Git

1798

Jika saya memiliki n komit, bagaimana saya bisa bercabang dari komit n-3?

Saya bisa melihat hash dari setiap commit.

membagikan doug
sumber

Jawaban:

2547

Anda dapat membuat cabang melalui hash:

git branch branchname <sha1-of-commit>

Atau dengan menggunakan referensi simbolis:

git branch branchname HEAD~3

Untuk checkout cabang saat membuatnya, gunakan

git checkout -b branchname <sha1-of-commit or HEAD~3>
CB Bailey
sumber
42
Git 1.8.2 izinkan saya menggunakan sha1 pendek untuk form pertama.
Dan Benamy
53
@MattFenwick Git akan memungkinkan Anda untuk menggunakan hash yang disingkat di mana pun hash diizinkan, selama hash yang disingkat adalah '' unik '' di repositori. Jadi jika tidak berhasil, coba tambahkan karakter lain dari hash.
colok
29
Untuk mendorong cabang baru dengan benar ke server .. diperlukan langkah terakhir ini:git push origin BRANCH_NAME
Gene Bo
3
untuk memulai cabang dari <sha1-of-commit>jalankan git checkout -b <name-of-branch> <sha1-of-commit>tetapi jika cabang sudah adagit checkout -B <name-of-branch> <sha1-of-commit>
mostafazh
258

Untuk melakukannya di github.com:

  1. Pergi ke proyek Anda.
  2. Klik pada "Komit".
  3. Klik pada <> ("Jelajahi repositori pada titik ini di histori") pada komit yang ingin Anda cabut.
  4. Klik pada "tree: xxxxxx" di kiri atas. Tepat di bawah bilah statistik bahasa, Anda akan mendapatkan opsi untuk "Temukan atau Buat Cabang" (cukup ketik nama cabang baru di sana)Cabang dari komit sebelumnya
OneSolitaryNoob
sumber
4
Pertanyaannya bukan tentang github, tetapi tentang git. Sebagian besar server git bukan github.
Anders Tornblad
46
Terlepas dari kenyataan bahwa ini adalah Github bukan git, itu masih sangat membantu!
Liz
Sayangnya itu masih menunjukkan perubahan dari komitmen lain, yang ingin saya hindari, itulah sebabnya saya mencari pertanyaan ini
Maxim
83

Keajaiban dapat dilakukan dengan git reset .

  1. Buat cabang baru dan alihkan ke sana (jadi semua komit terbaru Anda disimpan di sini)

    git checkout -b your_new_branch

  2. Beralih kembali ke cabang kerja sebelumnya (anggap masternya)

    git checkout master

  3. Hapus komit x terbaru, tetap bersihkan master

    git reset --hard HEAD~x # in your case, x = 3

Mulai saat ini, semua x commit terakhir hanya ada di cabang baru, bukan di cabang kerja Anda sebelumnya (master).

Jing Li
sumber
7
Ini adalah apa yang saya cari sejak menghilangkan komit dari Master dan membuatnya seolah-olah Anda ingat untuk membuat cabang sebelum komit dibuat. Terima kasih.
superbeck
7
Hanya saja, jangan lupa bahwa a git reset --hardbukan ide yang baik jika Anda sudah mendorong komit ke asal ...
LuisF
1
Anda bisa git push --force jika Anda sudah mendorong cabang sebelumnya
milan
Tetapi berhati-hatilah saat menggunakan --force blog.developer.atlassian.com/force-with- please
peater
74

Jika Anda tidak yakin komit mana yang ingin Anda cabut sebelumnya, Anda dapat memeriksa komit dan memeriksa kodenya (lihat sumber, kompilasi, uji) dengan

git checkout <sha1-of-commit>

setelah Anda menemukan komit yang ingin Anda cabut dari Anda dapat melakukannya dari dalam komit (yaitu tanpa kembali ke master terlebih dahulu) hanya dengan membuat cabang dengan cara biasa:

git checkout -b <branch_name>
stanm
sumber
22
git checkout -b <branch-name> <sha1-of-commit>
Tyler Long
sumber
1
Apa bedanya dengan " git branch branchname <sha1-of-commit>" (dari jawaban yang diterima)?
Peter Mortensen
Saya tidak tahu Saya pikir mereka setara. Saya selalu menggunakan git checkout -buntuk membuat cabang baru.
Tyler Long
10
stackoverflow.com/a/7987711/3590629 cabang git ... membuat cabang tetapi meninggalkan Anda di cabang saat ini. git checkout -b ... membuat cabang dan mengalihkan Anda ke sana.
esme_louise
9

Cara cepat untuk melakukannya di repo Github Anda adalah sebagai berikut:

  • Temukan komit spesifik dari cabang Anda
  • Di samping id SHA, klik pada 'Jelajahi repo pada titik ini dalam sejarah'
  • Di sini Anda dapat membuat cabang baru dari komit ini masukkan deskripsi gambar di sini
Vatsal Parekh
sumber
1
Ini sebenarnya sudah ketinggalan jaman
regetskcob
2
Pertanyaannya bukan tentang github.
Anders Tornblad
8

Cukup jalankan:

git checkout -b branch-name <commit>

Sebagai contoh :

git checkout -b import/january-2019 1d0fa4fa9ea961182114b63976482e634a8067b8

The checkoutperintah dengan parameter -bakan membuat cabang baru dan itu akan beralih Anda ke itu

d1jhoni1b
sumber
1
Saya suka yang satu ini. Terima kasih
The Fool
apakah mungkin membuat cabang berdasarkan komitmen SHA dari cabang fitur yang dihapus melalui permintaan tarik? Atau apakah saya harus beralih dari komit permintaan tarik pada master?
user2966445
jalankan git fetch& git branchperintah pada folder proyek Anda menggunakan terminal, kemudian periksa apakah cabang fitur ada, jika ini adalah kasus maka ya, tentu saja Anda tidak dapat membuat cabang dari cabang yang dihapus, Anda juga bisa mengembalikan penghapusan cabang jika cabang hilang
d1jhoni1b
4

Pertanyaan terkait yang bagus adalah: Bagaimana cara Anda mengetahuinya menggunakan --helpopsi git? Mari kita coba ini:

git branch --help

Kami melihat output ini:

NAME
       git-branch - List, create, or delete branches    

SYNOPSIS
       git branch [--color[=<when>] | --no-color] [-r | -a]
               [--list] [-v [--abbrev=<length> | --no-abbrev]]
               [--column[=<options>] | --no-column]
               [(--merged | --no-merged | --contains) [<commit>]] [--sort=<key>]
               [--points-at <object>] [<pattern>...]
       git branch [--set-upstream | --track | --no-track] [-l] [-f] <branchname> [<start-point>]
       git branch (--set-upstream-to=<upstream> | -u <upstream>) [<branchname>]
       git branch --unset-upstream [<branchname>]
       git branch (-m | -M) [<oldbranch>] <newbranch>
       git branch (-d | -D) [-r] <branchname>...
       git branch --edit-description [<branchname>]

Gobbledegook.

Cari melalui teks berikutnya untuk kata "komit". Kami menemukan ini:

   <start-point>
       The new branch head will point to this commit. It may be given as a branch name, a
       commit-id, or a tag. If this option is omitted, the current HEAD will be used instead.

Kami pergi ke suatu tempat!

Sekarang, fokuslah pada baris buku pegangan ini:

git branch [--set-upstream | --track | --no-track] [-l] [-f] <branchname> [<start-point>]

Padatkan itu menjadi ini:

git branch <branchname> [<start-point>]

Dan selesai.

Jaket ungu
sumber
1
Aku benci git. Terima kasih.
Byron Whitlock
4

Untuk melakukan ini di Eclipse:

  • Pergi ke Perspektif "Git Repository Exploring".
  • Luaskan "Tag" dan pilih komit yang ingin Anda buat cabang.
  • Klik kanan pada komit dan pilih "Buat Cabang".
  • Berikan nama cabang.

Ini akan membuat cabang lokal untuk Anda. Kemudian setiap kali Anda mendorong perubahan, cabang Anda akan didorong ke server jarak jauh.

Saurabhcdt
sumber
3

Anda dapat melakukannya di Stash.

  1. Klik komit
  2. Di kanan atas layar klik "Tandai komit ini"
  3. Kemudian Anda dapat membuat cabang baru dari tag yang baru saja Anda buat.
David Ruan
sumber
Apa GUI ini? GitHub?
ostrichofevil
Atlassian Stash
David Ruan
3

Saya bisa melakukannya seperti ini:

git branch new_branch_name `git log -n 1 --skip 3 --format=%H`

Di mana Anda harus memasukkan nilai lewati. 0 adalah yang terbaru, 1 adalah yang sebelumnya, 2 adalah komit sebelum itu, dll.

Mike Graf
sumber
4
Mengapa tidak digunakan saja HEAD~1(di mana 1 menentukan 1 komit kembali)?
jduncanator
1
Cara Anda dicakup oleh jawaban yang dipilih, dan berfungsi dengan baik. Milik saya adalah cara yang berbeda dari jawaban yang dipilih.
Mike Graf
3

Ini menciptakan cabang dengan satu perintah:

git push origin <sha1-of-commit>:refs/heads/<branch-name>

Saya lebih suka cara ini lebih baik daripada yang diterbitkan di atas, karena itu membuat cabang segera (tidak memerlukan perintah push tambahan setelah itu).

Alexander Samoylov
sumber
3

Menggunakan Sourcetree | Cara termudah.

  • Pertama, checkout cabang yang ingin Anda ambil komit spesifik untuk membuat cabang baru.
  • Kemudian lihat bilah alat, pilih Repositori> Cabang ... pintasannya adalah Command + Shift + B.
  • Dan pilih komit spesifik yang ingin Anda ambil. Dan berikan nama cabang baru kemudian buat cabang!

masukkan deskripsi gambar di sini

Dary
sumber
akhirnya menemukan jawaban yang bermanfaat ini. Terima kasih
Firda Sahidi
1

Inilah yang saya lakukan:

C:\Users\[path]\build>git checkout -b responsivenavigation 8a75b001096536b3216022484af3026aa9c7bb5b
Switched to a new branch 'responsivenavigation'

C:\Users\jaimemontoya\Dropbox\CuponClub\androidapp\build>git branch
  master
* responsivenavigation

Dalam hal ini, 8a75b001096536b3216022484af3026aa9c7bb5badalah dan komit lama milik mastercabang.

Jaime Montoya
sumber
1

Pergi ke komit tertentu dari repositori git

Kadang-kadang ketika mengerjakan repositori git Anda ingin kembali ke komit (revisi) tertentu untuk mengambil snapshot proyek Anda pada waktu tertentu. Untuk melakukan itu semua yang Anda butuhkan, SHA-1 hash dari commit yang Anda dapat dengan mudah menemukan memeriksa log dengan perintah:

git log --abbrev-commit --pretty=oneline

yang akan memberi Anda daftar ringkas semua komitmen dan versi singkat dari hash SHA-1.

Sekarang Anda tahu hash dari commit yang ingin Anda tuju, Anda dapat menggunakan salah satu dari 2 perintah berikut:

git checkout HASH

atau

git reset --hard HASH

Periksa

git checkout <commit> <paths>

Memberitahu git untuk mengganti status lintasan saat ini dengan statusnya di komit yang diberikan. Path dapat berupa file atau direktori.

Jika tidak ada cabang yang diberikan, git mengasumsikan commit HEAD.

git checkout <path> // restores path from your last commit. It is a 'filesystem-undo'.

Jika tidak ada jalur yang diberikan, git bergerak HEADke komit yang diberikan (sehingga mengubah komit yang Anda duduki dan kerjakan).

git checkout branch //means switching branches.

atur ulang

git reset <commit> //re-sets the current pointer to the given commit.

Jika Anda berada di cabang (biasanya Anda seharusnya), HEADdan cabang ini dipindahkan untuk melakukan.

Jika Anda dalam HEADkondisi terpisah , git reset hanya bergerak HEAD. Untuk mengatur ulang cabang, periksa dulu.

Jika Anda ingin tahu lebih banyak tentang perbedaan antara git reset dan checkout git saya akan merekomendasikan untuk membaca blog git resmi .

LYES - CHIOUKH
sumber
2
terima kasih atas jawaban Anda, FYI: Ini: git log --abbrev-commit --pretty=oneline dapat disingkatgit log --oneline
Suhaib
0

Pilih Komit

Untuk pengguna Git GUI Anda dapat memvisualisasikan semua riwayat (jika perlu) dan kemudian klik kanan pada komit yang ingin Anda cabut dari dan masukkan nama cabang.

Masukkan nama Cabang

Visualisasikan semua sejarah

Ivan
sumber
Ini akan berfungsi hanya jika pengguna menggunakan OS berbasis UI apa pun seperti Windows & MAC
Saurabhcdt
Betul. Balasan saya secara khusus dimulai dengan kata-kata "Untuk pengguna Git GUI ...". Saya belum memberikan balasan yang akan bekerja untuk semua orang - itu sudah dilakukan. Saya telah memberikan metode alternatif yang mungkin lebih mudah bagi banyak orang. Saya pikir alasan jawaban saya tidak disukai adalah karena ini bukan solusi untuk semua orang, tetapi itu sudah ada dengan beberapa ribu suara positif. Namun itu tidak membuat jawaban saya salah "Untuk pengguna Git GUI!". BUAT CABANG BARU ada di GUI. Saya ragu saya satu-satunya orang di dunia yang menggunakannya!
Ivan
0

Untuk melakukan jawaban yang diterima di Visual Studio 2015 & 2017:

Klik perubahan

Klik perubahan (panah merah di atas)

Klik Tindakan untuk Melihat Riwayat

Klik pada Tindakan (panah merah di atas) dan klik di Lihat Riwayat di Menu DropDown

Dan Tab baru akan terbuka:

Tab Riwayat

Dan Anda harus mengklik kanan komit sebelumnya yang ingin Anda kembalikan ke: klik kanan komit sebelumnya

Pilih untuk checkout cabang baru dan voila!

Di bawah, meskipun bukan bagian dari pertanyaan OP, tetapi saya sering melakukan keduanya dan ini adalah langkah jebakan, setidaknya bagi saya: jika Anda ingin kembali ke komit sebelumnya, tanpa checkout cabang baru, JANGAN memilih kembalikan (! ?); Anda harus memilih redefine --mixed atau --hard:

klik kanan komit sebelumnya dan definisikan ulang

Marcelo Scofano
sumber
Silakan bagikan jawaban Anda dalam bahasa Inggris karena sebagian besar dari kami di sini tidak berbicara atau tahu bahasa asing selain bahasa Inggris.
Shamiul Hasan Rumman
@ShamiulHasanRumman, dalam teks yang menjelaskan gambar - biasanya di bawah ini - saya menerjemahkan istilah Red Arrow menunjuk ke Bahasa Inggris, seperti itu Klik dalam Tindakan (panah merah di atas) Itu tidak cukup?
Marcelo Scofano
@MarceloScofano, apakah sulit untuk mengganti editor dalam bahasa Inggris sebelum mengambil tangkapan layar?
Andrew Surdu
1
@AndreiSurdu: karena saya tidak pernah perlu melakukan itu, saya berharap untuk mengubah ke bahasa Inggris saya harus menginstal beberapa paket tambahan. Tapi Anda benar, itu hanya membutuhkan VS restart, tidak ada instalasi sama sekali. Saya akan mencoba mengubah gambar di atas segera setelah saya mendapatkan waktu luang.
Marcelo Scofano
0

jika Anda menggunakan pohon sumber yang cukup lurus ke depan.

  • Klik kanan komit dari tempat Anda perlu membuat cabang baru
  • Klik pada 'cabang'
  • Ketik nama cabang baru di dialog yang muncul dan klik 'buat cabang'
Ibtisam Asif
sumber
0

Jika Anda mencari solusi berbasis baris perintah, Anda dapat mengabaikan jawaban saya. Saya akan menyarankan Anda untuk menggunakan GitKraken . Ini adalah klien UI git yang luar biasa. Ini menunjukkan pohon Git di beranda. Anda bisa melihat mereka dan tahu apa yang sedang terjadi dengan proyek tersebut. Cukup pilih komit tertentu, klik kanan padanya dan pilih opsi 'Buat cabang di sini'. Ini akan memberi Anda kotak teks untuk memasukkan nama cabang. Masukkan nama cabang, pilih 'OK' dan Anda ditetapkan. Ini benar-benar sangat mudah digunakan.

Shamiul Hasan Rumman
sumber