Git untuk pemula: Panduan praktis definitif

854

Ok, setelah melihat posting ini oleh PJ Hyett , saya telah memutuskan untuk melewatkan sampai akhir dan pergi dengan Git .

Jadi yang saya butuhkan adalah panduan praktis pemula untuk Git. "Pemula" didefinisikan sebagai seseorang yang tahu bagaimana menangani kompiler mereka, memahami sampai tingkat tertentu apa itu Makefile , dan telah menyentuh kontrol sumber tanpa memahaminya dengan baik.

"Praktis" didefinisikan sebagai orang ini tidak ingin masuk ke detail besar tentang apa yang dilakukan Git di latar belakang, dan bahkan tidak peduli (atau tahu) bahwa itu didistribusikan. Jawaban Anda mungkin mengisyaratkan kemungkinan, tetapi cobalah untuk mengarahkan pemula yang ingin menyimpan repositori 'utama' di 'server' yang didukung dan aman, dan perlakukan repositori lokal mereka hanya sebagai sumber daya 'klien'.

Begitu:

Instalasi / Pengaturan

Bekerja dengan kode

Penandaan, percabangan, rilis, baseline

Lain

Referensi pemula Git lainnya

Menggali Git

Saya akan memeriksa entri dari waktu ke waktu dan 'merapikan' mereka sehingga mereka memiliki tampilan / nuansa yang konsisten dan mudah untuk memindai daftar - jangan ragu untuk mengikuti "header - penjelasan singkat - daftar instruksi - gotcha dan templat info tambahan ". Saya juga akan menautkan ke entri dari daftar peluru di atas sehingga mudah untuk menemukannya nanti.

Adam Davis
sumber

Jawaban:

118

Bagaimana Anda membuat proyek / repositori baru?

Repositori git hanyalah sebuah direktori yang berisi .gitdirektori khusus .

Ini berbeda dari sistem kontrol versi "terpusat" (seperti subversi), di mana "repositori" di-host pada server jarak jauh, yang Anda checkoutmasukkan ke dalam direktori "copy pekerjaan". Dengan git, copy pekerjaan Anda adalah repositori.

Cukup jalankan git initdi direktori yang berisi file yang ingin Anda lacak.

Sebagai contoh,

cd ~/code/project001/
git init

Ini membuat .gitfolder (tersembunyi) di direktori saat ini.

Untuk membuat proyek baru, jalankan git initdengan argumen tambahan (nama direktori yang akan dibuat):

git init project002

(This is equivalent to: mkdir project002 && cd project002 && git init)

Untuk memeriksa apakah jalur saat ini berada dalam repositori git, cukup jalankan git status- jika ini bukan repositori, itu akan melaporkan "fatal: Not a git repository"

Anda juga bisa daftar .gitdirektori, dan periksa mengandung file / direktori yang mirip dengan yang berikut:

$ ls .git
HEAD         config       hooks/       objects/
branches/    description  info/        refs/

Jika karena alasan apa pun Anda ingin "de-git" repositori (Anda ingin berhenti menggunakan git untuk melacak proyek itu). Hapus saja .gitdirektori di tingkat dasar repositori.

cd ~/code/project001/
rm -rf .git/

Perhatian: Ini akan menghancurkan semua riwayat revisi, semua tag Anda, semua yang telah dilakukan git. Itu tidak akan menyentuh file "saat ini" (file yang saat ini dapat Anda lihat), tetapi perubahan sebelumnya, file yang dihapus dan sebagainya tidak akan dapat dipulihkan!

dbr
sumber
3
Git membuat objeknya hanya-baca, jadi Anda rm -rf .githarus menghapuskan database git.
Josh Lee
Biasanya file .gitignore perlu dibuat selama penggunaan normal untuk menentukan file / pohon untuk diabaikan dalam versi, jadi untuk melengkapi tentang bagian terakhir pada "de-gitting", selain menghapus .git Anda juga perlu menghapus. file gitignore. :)
Monoman
Bagaimana dengan repositori kosong? Entah bagaimana mereka "terpusat", dan saya pikir mereka adalah hal yang baik untuk banyak proyek yang memerlukan semacam sentralisasi (misalnya: proyek yang dikembangkan oleh banyak orang)
peoro
WRT berjalan git statusuntuk memastikan Anda berada dalam repositori: ini memiliki satu gotcha: jika Anda memiliki variabel lingkungan $ GIT_DIR disetel dalam shell Anda saat ini, git akan mengabaikan lokasi Anda saat ini dan menggunakan repositori pada $ GIT_DIR. Saya harus tahu, saya kehilangan satu jam untuk itu kemarin.
sanmiguel
110

GUI untuk git


Git GUI

Disertakan dengan git - Jalankan git guidari baris perintah, dan penginstal msysgit Windows menambahkannya ke menu Start.

Git GUI dapat melakukan sebagian besar dari apa yang perlu Anda lakukan dengan git. Termasuk perubahan tahap, konfigurasi git dan repositori, perubahan push, buat / checkout / hapus cabang, gabung, dan banyak hal lainnya.

Salah satu fitur favorit saya adalah cara pintas "garis panggung" dan "tahap hunk" di menu klik kanan, yang memungkinkan Anda melakukan bagian tertentu dari file. Anda dapat mencapai hal yang sama melalui git add -i, tetapi saya merasa lebih mudah digunakan.

Ini bukan aplikasi tercantik, tetapi bekerja di hampir semua platform (didasarkan pada Tcl / Tk)

Screenshot | screencast


GITK

Juga disertakan dengan git. Ini adalah penampil riwayat git, dan memungkinkan Anda memvisualisasikan riwayat repositori (termasuk cabang, saat cabang dibuat, dan digabung). Anda dapat melihat dan mencari komit.

Cocok dengan git-gui.


Gitnub

Aplikasi Mac OS X. Terutama setara dengan git log, tetapi memiliki beberapa integrasi dengan github (seperti "Tampilan jaringan").

Terlihat cantik, dan cocok dengan Mac OS X. Anda dapat mencari repositori. Kritik terbesar Gitnub adalah bahwa ia menunjukkan sejarah secara linear (cabang tunggal pada suatu waktu) - Gitnub tidak memvisualisasikan percabangan dan penggabungan, yang mungkin penting dengan git, meskipun ini merupakan perbaikan yang direncanakan.

Unduh tautan, ubah log, dan tangkapan layar | repositori git


GitX

Dimaksudkan untuk menjadi "klon gitk untuk OS X".

Ini dapat memvisualisasikan sejarah percabangan non-linear, melakukan komit, melihat dan mencari komit, dan memiliki beberapa fitur bagus lainnya seperti dapat "Melihat cepat" file apa pun dalam revisi apa pun (ruang tekan dalam tampilan daftar file), mengekspor file apa pun (via seret dan lepas).

Ini jauh lebih baik diintegrasikan ke dalam OS X daripada git-gui/ gitk, dan cepat dan stabil bahkan dengan repositori yang sangat besar.

Pieter repositori git asli belum diperbarui baru-baru ini (lebih dari setahun pada saat penulisan). Cabang yang dikelola lebih aktif tersedia di brotherbard / gitx - ia menambahkan "sidebar, fetch, pull, push, add remote, gabung, cherry-pick, rebase, clone, clone to"

Unduh | Screenshot | repositori git | garpu saudara | garpu laullon


SmartGit

Dari beranda:

SmartGit adalah ujung depan untuk sistem kontrol versi terdistribusi Git dan berjalan pada Windows, Mac OS X dan Linux. SmartGit ditujukan untuk pengembang yang lebih memilih antarmuka pengguna grafis daripada klien baris perintah, agar lebih produktif dengan Git - DVCS paling kuat saat ini.

Anda dapat mengunduhnya dari situs web mereka .

Unduh


TortoiseGit

Versi TortoiseSVN Git untuk pengguna Windows.

Ini porting TortoiseSVN ke TortoiseGit Rilis terbaru 1.2.1.0 Rilis ini dapat menyelesaikan tugas reguler, seperti melakukan, menunjukkan log, berbeda dua versi, membuat cabang dan tag, Buat tambalan dan sebagainya. Lihat ReleaseNotes untuk detailnya. Selamat berkontribusi proyek ini.

Unduh


QGit

QGit adalah penampil GUI Git yang dibangun pada Qt / C ++.

Dengan qgit Anda akan dapat menelusuri riwayat revisi, melihat konten tambalan dan file yang diubah, secara grafis mengikuti berbagai cabang pengembangan.

Unduh


gitg

gitg adalah penampil repositori git yang menargetkan gtk + / GNOME. Salah satu tujuan utamanya adalah untuk memberikan pengalaman pengguna yang lebih bersatu untuk antarmuka git di beberapa desktop. Ini tidak menulis aplikasi lintas platform, tetapi dengan kolaborasi erat dengan klien serupa untuk sistem operasi lain (seperti GitX untuk OS X).

fitur

  • Jelajahi riwayat revisi.
  • Menangani repositori besar (memuat repositori linux, 17000+ revisi, di bawah 1 detik).
  • Komit perubahan.
  • Stage / unstage individual hunks.
  • Kembalikan perubahan.
  • Tampilkan perbedaan perubahan berwarna dalam revisi.
  • Jelajahi pohon untuk revisi yang diberikan.
  • Ekspor bagian pohon revisi yang diberikan.
  • Berikan refspec apa pun yang dapat dimengerti oleh perintah seperti 'git log' untuk membangun sejarah.
  • Tampilkan dan beralih di antara cabang dalam tampilan riwayat.

Unduh: rilis atau sumber


Gitbox

Gitbox adalah antarmuka grafis Mac OS X untuk sistem kontrol versi Git. Dalam satu jendela Anda melihat cabang, riwayat, dan status direktori kerja.

Operasi sehari-hari mudah: tahap dan hapus stage perubahan dengan kotak centang. Komit, tarik, gabungkan, dan dorong dengan satu klik. Klik dua kali perubahan untuk menampilkan perbedaan dengan FileMerge.app.

Unduh


Gity

Situs web Gity tidak memiliki banyak informasi, tetapi dari tangkapan layar di sana tampaknya merupakan sumber terbuka OS X git gui yang kaya fitur.

Unduh atau sumber


Meld

Meld adalah alat penggabungan dan penggambaran visual. Anda dapat membandingkan dua atau tiga file dan mengeditnya di tempat (perbarui pembaruan secara dinamis). Anda dapat membandingkan dua atau tiga folder dan meluncurkan perbandingan file. Anda dapat menelusuri dan melihat salinan yang berfungsi dari sistem kontrol versi populer seperti CVS, Subversion, Bazaar-ng dan Mercurial [ dan Git ].

Unduhan


Katana

A Git GUI untuk OSX oleh Steve Dekorte.

Sekilas, lihat cabang mana yang memiliki perubahan untuk menarik dan repo lokal memiliki perubahan untuk mendorong. Operasi tambahan, komit, dorong, tarik, tag, dan setel ulang didukung serta perbedaan visual dan penelusuran visual hierasi proyek yang menyoroti perubahan dan penambahan lokal.

Gratis untuk 1 repositori, $ 25 untuk lebih banyak.

Unduh


Sprout (sebelumnya GitMac)

Berfokus untuk membuat Git mudah digunakan. Menampilkan UI Cocoa (seperti mac) asli, penelusuran repositori cepat, kloning, push / pull, percabangan / penggabungan, diff visual, cabang jarak jauh, akses mudah ke Terminal, dan banyak lagi.

Dengan membuat tindakan Git yang paling umum digunakan, intuitif dan mudah dilakukan, Sprout (sebelumnya GitMac) menjadikan Git mudah digunakan. Kompatibel dengan sebagian besar alur kerja Git, Sprout sangat bagus untuk perancang dan pengembang, kolaborasi tim dan pengguna tingkat lanjut dan pemula.

Unduh | Situs web


Menara

Git GUI yang kaya fitur untuk Mac OSX. Uji coba gratis 30 hari, $ 59USD untuk lisensi pengguna tunggal.

Unduh | Situs web


EGit

EGit adalah penyedia Tim Eclipse untuk sistem kontrol versi Git. Git adalah SCM terdistribusi, yang berarti setiap pengembang memiliki salinan lengkap semua riwayat setiap revisi kode, membuat kueri terhadap sejarah sangat cepat dan serbaguna.

Proyek EGit mengimplementasikan tooling Eclipse di atas implementasi Java Git dari JGit.

Unduh | Situs web


Ekstensi Git

Open Source untuk Windows - instal semua yang Anda butuhkan untuk bekerja dengan Git dalam satu paket, mudah digunakan.

Git Extensions adalah toolkit untuk membuat bekerja dengan Git di Windows lebih intuitif. Ekstensi shell akan terintegrasi dalam Windows Explorer dan menyajikan menu konteks pada file dan direktori. Ada juga plugin Visual Studio untuk menggunakan git dari Visual Studio.

Unduh

Terima kasih banyak kepada dbr untuk menguraikan hal-hal git gui.


SourceTree

SourceTree adalah klien Mac gratis untuk Git, Mercurial dan SVN. Dibangun oleh Atlassian, orang-orang di balik BitBucket, tampaknya berfungsi sama baiknya dengan sistem VC apa pun, yang memungkinkan Anda menguasai satu alat tunggal untuk digunakan dengan semua proyek Anda, namun itu dikendalikan oleh versi. Penuh fitur, dan GRATIS.

Siap Pakar & Fitur untuk pengguna awam dan lanjut:

Tinjau perubahan yang keluar dan masuk. Cherry memilih di antara cabang. Penanganan patch, rebase, simpanan / rak dan banyak lagi.

Unduh | Situs web


dylanfm
sumber
2
Anda memiliki beberapa jawaban yang bagus (terutama gitcast, dan jawaban push / pull), tetapi bisakah saya merekomendasikan pemecahannya menjadi jawaban yang terpisah? Penanya meminta agar Anda "jangan mencoba menyatukan banyak informasi menjadi satu jawaban"!
dbr
3
Mungkin Anda harus menambahkan TortoiseGit code.google.com/p/tortoisegit ke daftar Anda, untuk pemakai Windows ...
kret
1
Gity ( macendeavor.com/gity ) adalah sebuah opsi, tetapi masih dalam pengembangan (OS X)
Dave DeLong
2
Tower ("Klien Git yang paling kuat untuk Mac") adalah klien baru yang cantik untuk Git.
rubiii
59

Yah, terlepas dari kenyataan bahwa Anda meminta kami untuk tidak "sekadar" menghubungkan ke sumber daya lain, cukup bodoh ketika sudah ada sumber daya yang tumbuh (dan tumbuh) di komunitas yang benar-benar bagus: Buku Komunitas Git . Serius, 20 + pertanyaan dalam pertanyaan ini akan menjadi apa pun selain singkat dan konsisten. Git Community Book tersedia dalam bentuk HTML dan PDF dan menjawab banyak pertanyaan Anda dengan jawaban yang jelas, diformat dengan baik, dan ditinjau sejawat serta dalam format yang memungkinkan Anda untuk langsung menuju ke masalah Anda.

Sayangnya, jika posting saya benar-benar mengecewakan Anda maka saya akan menghapusnya. Katakan saja begitu.

Pat Notz
sumber
2
Jika Anda tidak menggunakan git karena ini adalah DVCS, mengapa repot-repot menggunakan git? Pertanyaan ini konyol dan mengalihkan sumber daya yang dapat dihabiskan untuk hal-hal lain untuk memenuhi tujuan yang dipertanyakan.
Randal Schwartz
56

Cara mengkonfigurasinya untuk mengabaikan file:

Kemampuan untuk membuat git mengabaikan file yang tidak ingin Anda lacak sangat berguna.

Untuk mengabaikan file atau set file, Anda memberikan pola. Sintaks pola untuk git cukup sederhana, tetapi kuat. Ini berlaku untuk ketiga file yang berbeda yang akan saya sebutkan di bawah ini.

  • Baris kosong tidak mengabaikan file, biasanya digunakan sebagai pemisah.
  • Garis yang menatap # berfungsi sebagai komentar.
  • Itu ! awalan adalah opsional dan akan meniadakan pola. Pola negasi apa pun yang cocok akan menimpa pola prioritas yang lebih rendah.
  • Mendukung ekspresi lanjutan dan kartu liar
    • Mis: Pola: *. [Oa] akan mengabaikan semua file dalam repositori yang berakhiran .o atau .a (objek dan arsip file)
  • Jika suatu pola memiliki direktori yang diakhiri dengan slash git hanya akan cocok dengan direktori ini dan jalur di bawahnya. Ini tidak termasuk file reguler dan tautan simbolik dari pertandingan.
  • Garis miring terkemuka akan cocok dengan semua file dalam nama jalur itu.
    • Contoh: Pola /*.c akan cocok dengan file foo.c tetapi tidak bilah / awesome.c

Contoh yang bagus dari halaman manual gitignore (5) :

$ git status
[...]
# Untracked files:
[...]
#       Documentation/foo.html
#       Documentation/gitignore.html
#       file.o
#       lib.a
#       src/internal.o
[...]
$ cat .git/info/exclude
  # ignore objects and archives, anywhere in the tree.
  *.[oa]
$ cat Documentation/.gitignore
# ignore generated html files,
*.html
# except foo.html which is maintained by hand
!foo.html
$ git status
[...]
# Untracked files:
[...]
#       Documentation/foo.html
[...]

Secara umum ada tiga cara berbeda untuk mengabaikan file yang tidak terlacak.

1) Abaikan untuk semua pengguna repositori:

Tambahkan file bernama .gitignore ke akar copy pekerjaan Anda.

Edit .gitignore agar sesuai dengan preferensi Anda yang file-nya seharusnya / tidak boleh diabaikan.

git add .gitignore 

dan komit ketika Anda selesai.

2) Abaikan hanya untuk salinan repositori Anda:

Tambahkan / Edit file $ GIT_DIR / info / kecualikan dalam copy pekerjaan Anda, dengan pola pilihan Anda.

Contoh: Salinan kerja saya adalah ~ / src / project1 jadi saya akan mengedit ~ / src / project1 / .git / info / exclude

Kamu sudah selesai!

3) Abaikan dalam semua situasi, di sistem Anda:

Pola abaikan global untuk sistem Anda dapat berupa file bernama apa pun yang Anda inginkan.

Milik saya secara pribadi disebut ~ / .gitglobalignore

Saya kemudian dapat memberi tahu git tentang file ini dengan mengedit file ~ / .gitconfig saya dengan baris berikut:

core.excludesfile = ~/.gitglobalignore

Kamu sudah selesai!

Saya menemukan halaman manual gitignore sebagai sumber terbaik untuk informasi lebih lanjut.

Brian Gianforcaro
sumber
Bisakah seseorang, tolong, tambahkan satu detail kecil tapi penting ke posting ini? Ini hanya berfungsi untuk file yang belum dilacak oleh git. Untuk 'membuka kembali' file tetapi membiarkannya dalam filesystem, Anda perlu 'git rm --cached filename'. Terima kasih!
Nikita Rybak
Saya hanya ingin mencatat bahwa menambahkan baris core.excludesfile tidak berfungsi untuk saya. Saya harus [git config --global core.excludesfile ~ / .gitglobalignore] untuk membuatnya bekerja.
Coding District
Sekarang ada proyek di Github bernama gitignore yang memiliki file gitignore untuk berbagai bahasa dan lingkungan pengembangan: github.com/github/gitignore
Ryan Lundy
47

Bagaimana Anda 'menandai' serangkaian revisi tertentu

Bagaimana Anda 'menandai' 'tag' atau 'merilis' set revisi tertentu untuk set file tertentu sehingga Anda selalu dapat menariknya nanti?

Menggunakan git tagperintah.

Untuk hanya "menandai" revisi saat ini, Anda cukup menjalankan ..

git tag -a thetagname
git tag -a 0.1
git tag -a 2.6.1-rc1 -m 'Released on 01/02/03'

Untuk daftar tag saat ini, jalankan saja git tagtanpa argumen, atau -l(huruf kecil L):

$ git tag -a thetagname # and enter a message, or use -m 'My tag annotation'
$ git tag -l
thetagname

Untuk menghapus tag, Anda menggunakan -dbendera:

$ git tag -d thetagname 
Deleted tag 'thetagname'
$ git tag
[no output]

Untuk menandai komit tertentu (sebelumnya), Anda cukup lakukan ..

git tag [tag name] [revision SHA1 hash]

Sebagai contoh:

git tag 1.1.1 81b15a68c6c3e71f72e766931df4e6499990385b

Catatan: secara default, git membuat tag "ringan" (pada dasarnya referensi ke revisi tertentu). Cara "benar" adalah menggunakan -abendera. Ini akan meluncurkan editor Anda meminta pesan tag (identik dengan meminta pesan komit, Anda juga dapat menggunakan -mbendera untuk memasok pesan tag pada baris perintah). Menggunakan tag beranotasi membuat objek dengan ID sendiri, tanggal, tagger (penulis), dan opsional tanda tangan GPG (menggunakan -stag). Untuk informasi lebih lanjut tentang ini, lihat posting ini

git tag mytagwithmsg -a -m 'This is a tag, with message'

Dan untuk mencantumkan tag dengan anotasi, gunakan -n1bendera untuk menampilkan 1 baris dari setiap pesan tag ( -n245untuk menampilkan 245 baris pertama dari setiap anotasi, dan seterusnya):

$ git tag -l -n1
mytagwithmsg    This is a tag, with message

Untuk informasi lebih lanjut, lihat Halaman Manual git-tag (1)

dbr
sumber
tag git tidak membuat tag secara default, hanya referensi ringan. Anda harus menggunakan -a atau -s untuk membuat objek tag (yang hal-hal seperti gambarkan akan digunakan): rockstarprogrammer.org/post/2008/oct/16/…
Dustin
Ah, menarik. Terima kasih, saya telah memperbarui jawaban untuk mencerminkan ini
dbr
Dan bagaimana Anda menandai revisi yang sebelumnya dilakukan? (maaf itu terlalu lama jadi saya membalik-balik, apakah aku kehilangan sesuatu?)
Hasen
hasen j: Menambahkan info untuk menjawab, pada dasarnyagit tag tagname revision_SHA1
dbr
1
Untuk mendorong tag ke repo jarak jauh, tambahkan - tag saat menggunakan git push (info dari area bantuan github).
Héctor Ramos
46

Contoh alur kerja dengan GIT.

Git sangat fleksibel dan beradaptasi baik untuk alur kerja apa pun, tetapi tidak menegakkan alur kerja tertentu mungkin memiliki efek negatif sehingga sulit untuk memahami apa yang dapat Anda lakukan dengan git di luar alur kerja "cadangan" linier, dan bagaimana percabangan yang bermanfaat misalnya .

Posting blog ini menjelaskan dengan baik alur kerja yang sangat sederhana namun efektif yang sangat mudah diatur menggunakan git.

mengutip dari posting blog: Kami menganggap asal / master sebagai cabang utama di mana kode sumber HEAD selalu mencerminkan keadaan siap produksi:

Alur kerja telah menjadi cukup populer untuk membuat proyek yang mengimplementasikan alur kerja ini: git-flow

Ilustrasi yang bagus tentang alur kerja sederhana, di mana Anda membuat semua perubahan dalam pengembangan, dan hanya mendorong untuk menguasai ketika kode berada dalam status produksi:

alur kerja sederhana

Sekarang katakanlah Anda ingin bekerja pada fitur baru, atau refactoring sebuah modul. Anda bisa membuat cabang baru, apa yang bisa kita sebut cabang "fitur", sesuatu yang akan memakan waktu dan mungkin memecahkan beberapa kode. Setelah fitur Anda "cukup stabil" dan ingin memindahkannya "lebih dekat" ke produksi, Anda menggabungkan cabang fitur Anda menjadi pengembangan. Ketika semua bug diurutkan setelah penggabungan dan kode Anda melewati semua pengujian, Anda mendorong perubahan Anda ke master.

Selama semua proses ini, Anda menemukan bug keamanan yang mengerikan, yang harus segera diperbaiki. Anda bisa memiliki cabang yang disebut perbaikan terbaru, yang membuat perubahan yang didorong lebih cepat kembali ke produksi daripada cabang "berkembang" yang normal.

Di sini Anda memiliki ilustrasi tentang bagaimana alur kerja fitur / perbaikan terbaru / pengembangan / produksi ini kelihatannya (dijelaskan dengan baik di posting blog, dan saya ulangi, posting blog menjelaskan keseluruhan proses secara lebih rinci dan jauh lebih baik daripada yang saya lakukan) .

Contoh alur kerja Git

ashwoods
sumber
Saya seorang pemula git, dan diagram ini membuatnya lebih membingungkan bagi saya.
finnw
Yang mana, yang pertama, atau yang terakhir? Saya tidak benar-benar ingin membuat posting terlalu lama, tetapi saya akan menambahkan sedikit penjelasan dari kedua diagram nanti.
ashwood
Baca artikel selengkapnya. Saya bingung dengan diagram ini juga, tetapi posting blog ditulis dengan sangat baik nvie.com/posts/a-successful-git-branching-model
Felipe Sabino
Apakah sekarang lebih baik? saya hanya ingin memberikan gambaran kasar, tidak memposting ulang seluruh posting blog di sini :)
ashwood
39

Berikut adalah salinan pos PJ Hyett, karena tidak tersedia lagi:

Git Tidak Sulit

23 Nov 2008

Ketika kami memberi tahu orang-orang mengapa mereka harus menggunakan Git di atas Subversion, garis masuknya adalah, "Git melakukan Subversi lebih baik daripada Subversion, tetapi itu jauh lebih banyak dari itu."

"Banyak lagi" terdiri dari banyak hal yang membuat Git benar-benar bersinar, tetapi itu bisa sangat luar biasa bagi mereka yang datang dari Subversion SCM lainnya.

Yang mengatakan, tidak ada yang menghentikan Anda dari menggunakan Git sama seperti Anda menggunakan Subversion saat Anda melakukan transisi.

Dengan asumsi Anda telah menginstal perangkat lunak yang diperlukan dan memiliki repositori jarak jauh di suatu tempat, ini adalah bagaimana Anda akan mengambil kode dan mendorong perubahan Anda kembali dengan Subversion:

$ svn checkout svn://foo.googlecode.com/svn/trunk foo
# make your changes
$ svn commit -m "my first commit"

Dan bagaimana Anda melakukannya di Git:

$ git clone [email protected]:pjhyett/foo.git
# make your changes
$ git commit -a -m "my first commit"
$ git push

Satu perintah lagi untuk mewujudkannya di Git. Perintah tambahan itu memiliki implikasi besar, tetapi untuk keperluan posting ini, hanya itu yang kita bicarakan, satu perintah tambahan.

Lihat, itu sebenarnya tidak terlalu sulit.

Pembaruan: Saya akan lalai untuk tidak juga menyebutkan bahwa yang setara dengan memperbarui salinan lokal Anda di Subversion dibandingkan dengan Git adalah svn updatedan git pull, masing-masing. Hanya satu perintah dalam kedua kasus.

Adam Davis
sumber
Dalam contoh pertama saya melihat Anda memeriksa ke jalur relatif ./footetapi tidak ada jalur yang ditentukan untuk klon get, di mana Anda memeriksa?
JD Isaacks
33

Cara menginstal Git

Di Windows:

Instal msysgit

Ada beberapa unduhan:

  • Git: Gunakan ini kecuali Anda secara khusus membutuhkan salah satu opsi lain di bawah ini.
  • PortableGit: Gunakan ini jika Anda ingin menjalankan Git di PC tanpa menginstal di PC itu (mis. Menjalankan Git dari drive USB)
  • msysGit: Gunakan ini jika Anda ingin mengembangkan Git itu sendiri. Jika Anda hanya ingin menggunakan Git untuk kode sumber Anda , tetapi tidak ingin mengedit kode sumber Git , Anda tidak memerlukan ini.

Ini juga menginstal shell bash Cygwin, sehingga Anda dapat menggunakan gitshell yang lebih bagus (dari cmd.exe), dan juga termasuk git-gui (dapat diakses melalui git guiperintah, atau Start > All Programs > Gitmenu)

Mac OS X

Gunakan installer-git-osx , atau Anda juga dapat menginstal dari sumber

Melalui manajer paket

Instal gitmenggunakan pengelola paket asli Anda. Misalnya, di Debian (atau Ubuntu):

apt-get install git-core

Atau di Mac OS X, melalui MacPorts :

sudo port install git-core+bash_completion+doc

… Atau mengadu:

fink install git

... atau Homebrew :

brew install git

Pada distribusi berbasis Red Hat, seperti Fedora:

yum install git

Dalam Cygwin paket Git dapat ditemukan di bawah bagian "devel"

Dari sumber (Mac OS X / Linux / BSD / dll.)

Di Mac OS X, jika Anda memiliki Alat Pengembang yang diinstal, Anda dapat mengkompilasi Git dari sumber dengan sangat mudah. Unduh versi terbaru Git sebagai .tar.bzatau .tar.gzdari http://git-scm.com/ , dan ekstrak (klik dua kali pada Finder)

Di Linux / BSD / dll. itu harus sama. Misalnya, di Debian (dan Ubuntu), Anda harus menginstal build-essentialpaket via apt.

Kemudian di Terminal, cdke tempat Anda mengekstrak file (Menjalankan cd ~/Downloads/git*/harus bekerja), dan kemudian jalankan ..

./configure && make && sudo make install

Ini akan menginstal Git ke tempat default ( /usr/local- begitu gitjuga di /usr/local/bin/git)

Ini akan meminta Anda untuk memasukkan kata sandi Anda (untuk sudo), ini sehingga ia dapat menulis ke /usr/local/direktori, yang hanya dapat diakses oleh pengguna "root" sehingga diperlukan sudo!

Jika Anda menginstalnya di tempat yang terpisah (jadi file Git tidak tercampur dengan alat lain), gunakan --prefixdengan perintah configure:

./configure --prefix=/usr/local/gitpath
make
sudo make install

Ini akan menginstal gitbiner ke /usr/local/bin/gitpath/bin/git- jadi Anda tidak perlu mengetikkan itu setiap kali, Anda harus menambahkannya $PATHdengan menambahkan baris berikut ke dalam ~/.profile:

export PATH="${PATH}:/usr/local/bin/gitpath/bin/"

Jika Anda tidak memiliki akses sudo, Anda dapat menggunakan --prefix=/Users/myusername/bindan menginstal ke direktori home Anda. Ingat untuk menambahkan ~/bin/ke$PATH

Script x-git-update-ke-terbaru-versi mengotomatiskan banyak hal ini:

Skrip ini memperbarui klon lokal saya dari git repo (localy at ~/work/track/git), dan kemudian mengkonfigurasi, menginstal (at /usr/local/git- git describe) dan memperbarui /usr/local/gitsymlink.

Dengan cara ini, saya dapat memiliki /usr/local/git/bindi saya PATHdan saya selalu menggunakan versi terbaru.

Versi terbaru dari skrip ini juga menginstal halaman manual. Anda perlu mengubah Anda MANPATHuntuk memasukkan /usr/local/git/share/mandirektori.

dbr
sumber
5
Pada Fedora: yum install git. Untuk menjalankan GUI yum install git-gui.
Cristian Ciupitu
2
Pada Mac,sudo port install git-core+bash_completion+doc
Singletoned
Saya mengunduh fink untuk mac, tetapi menjalankan fink install git memberi saya kesalahan: "Gagal: tidak ada paket yang ditemukan untuk spesifikasi 'git'!"
quano
@ Quano Seharusnya ada di sana, pdb.finkproject.org/pdb/package.php/git - periksa Fink diperbarui dengan benar - Saya pikir menjalankan fink self-updateakan membantu
dbr
32

Setel Ulang Git

Katakanlah Anda menarik, menggabungkannya ke dalam kode Anda, dan memutuskan Anda tidak menyukainya. Gunakan git-log, atau tig, dan temukan hash di mana pun Anda ingin kembali (mungkin komit terakhir Anda sebelum menarik / menggabungkan) salin hash, dan lakukan:

# Revert to a previous commit by hash:
git-reset --hard <hash>

Alih-alih hash, Anda bisa menggunakan HEAD ^ sebagai jalan pintas untuk komit sebelumnya.

# Revert to previous commit:
git-reset --hard HEAD^
Dean Sebaliknya
sumber
4
Ini analog dengan pemulihan di sebagian besar sistem kontrol versi terpusat lainnya.
Jeremy Wall
"$ git-reset --hard HEAD ^" harus merupakan singkatan untuk induk dari kepala (yaitu negara sebelumnya sebelum komit terakhir).
Ben Page
6
hanya seorang tua biasa git resetharus unstage disengajagit add
slf
31

Bagaimana Anda mengatur repositori tim bersama?

Cara mengatur repositori normal dijelaskan di sini - tetapi bagaimana Anda mengatur repositori tim yang semua orang dapat tarik dan dorong dari dan ke?

Menggunakan sistem file NFS bersama

Anggap tim Anda sudah memiliki misalnya keanggotaan grup bersama yang dapat digunakan.

mkdir /your/share/folder/project.git
cd /your/share/folder/project.git
newgrp yourteamgroup # if necessary
git init --bare --shared

Untuk mulai menggunakan repositori ini, hal termudah untuk dilakukan adalah mulai dari repositori lokal yang sudah Anda gunakan:

cd your/local/workspace/project
git remote add origin /your/share/folder/project.git
git push origin master

Orang lain sekarang dapat mengkloning ini dan mulai bekerja:

cd your/local/workspace
git clone /your/share/folder/project.git

Menggunakan SSH

Siapkan akun pengguna di server target. Apakah Anda menggunakan akun tanpa kata sandi, akun dengan kata sandi, atau menggunakan authorized_keysbenar-benar tergantung pada tingkat keamanan yang Anda butuhkan. Lihatlah Mengkonfigurasi Git melalui SSH untuk informasi lebih lanjut.

Jika semua pengembang menggunakan akun yang sama untuk mengakses repositori bersama ini, Anda tidak perlu menggunakan --sharedopsi seperti di atas.

Setelah memulai repositori dengan cara yang sama seperti di atas, Anda melakukan dorongan awal seperti ini:

cd your/local/workspace/project
git remote add origin user@server:/path/to/project.git
git push origin master

Lihat kesamaannya dengan yang di atas? Satu-satunya hal yang mungkin terjadi adalah SSH meminta kata sandi jika akun tersebut memiliki kata sandi. Jika Anda mendapatkan prompt ini pada akun tanpa kata sandi, server SSH mungkin telah dinonaktifkan PermitEmptyPasswords.

Kloning sekarang terlihat seperti ini:

cd your/local/workspace
git clone user@server:/path/to/project.git
Asgeir S. Nilsen
sumber
selain NFS - bagaimana Anda mengatur git server untuk bekerja lebih dari ssh? - Seperti contoh kecil dari github.com?
Dafydd Rees
Apakah perlu untuk menetapkan bit sticky grup pada direktori yang relevan, atau apakah git menangani semua itu? Jika yang terakhir, bagaimana git tahu grup apa yang digunakan pada izin untuk file Unix?
Norman Ramsey
Saya telah menambahkan bagian tentang SSH seperti yang diminta. Bit lengket diperlukan jika tidak semua pengembang memiliki grup bersama sebagai grup utama mereka. Jika ada pengguna yang memiliki grup utama yang berbeda, mereka secara default akan membuat file dengan kepemilikan grup ini. Ini terjadi di bawah git dan karenanya tidak selalu berada dalam kendali git.
Asgeir S. Nilsen
untuk apa grup git repo-config core.sharedRepository berguna?
systempuntoout
28

git statusadalah temanmu, seringlah menggunakannya. Baik untuk menjawab pertanyaan seperti:

  • Apa yang dilakukan perintah itu?
  • Di cabang apa saya?
  • Perubahan apa yang akan saya lakukan, dan apakah saya lupa sesuatu?
  • Apakah saya berada di tengah sesuatu yang terakhir kali saya mengerjakan proyek ini (berhari-hari, berminggu-minggu, atau mungkin berbulan-bulan yang lalu)?

Tidak seperti, katakanlah svn status, git statusberjalan hampir instan bahkan pada proyek besar. Saya sering menemukannya meyakinkan ketika belajar git sering menggunakannya, untuk memastikan model mental saya tentang apa yang terjadi akurat. Sekarang saya kebanyakan hanya menggunakannya untuk mengingatkan diri sendiri apa yang telah saya ubah sejak komit terakhir saya.

Jelas, ini jauh lebih berguna jika .gitignore Anda dikonfigurasi dengan benar.

Peter Burns
sumber
27

Perubahan Komit

Setelah Anda mengedit file, Anda perlu melakukan perubahan pada git. Ketika Anda menjalankan perintah ini, ia akan meminta pesan komit - yang hanya sedikit teks yang memberitahu semua orang apa yang telah Anda ubah.

$ git commit source/main.c

Akan melakukan file main.c di direktori ./source/

$ git commit -a # the -a flag pulls in all modified files

akan mengkomit semua file yang diubah (tetapi bukan file baru, itu perlu ditambahkan ke indeks dengan git-add). Jika Anda hanya ingin mengkomit file-file tertentu maka Anda perlu mem-stage-nya terlebih dahulu dengan git-add dan kemudian komit tanpa tanda -a.

Mengkomit hanya mengubah repositori lokal Anda meskipun bukan repositori jarak jauh. Jika Anda ingin mengirim komit ke repositori jarak jauh maka Anda perlu melakukan push.

$ git push <remote> <branch> # push new commits to the <branch> on the <remote> repository

Untuk seseorang yang datang dari CVS atau SVN ini adalah perubahan karena komit ke repositori pusat sekarang memerlukan dua langkah.

Adam Davis
sumber
27

Bagaimana Anda bercabang?

Cabang default di repositori git disebut master.

Untuk membuat penggunaan cabang baru

git branch <branch-name>

Untuk melihat daftar semua cabang dalam tipe repositori saat ini

git branch

Jika Anda ingin beralih ke cabang lain yang dapat Anda gunakan

git checkout <branch-name>

Untuk membuat cabang baru dan beralih ke itu dalam satu langkah

git checkout -b <branch-name>

Untuk menghapus cabang, gunakan

git branch -d <branch-name>

Untuk membuat cabang dengan perubahan dari cabang saat ini, lakukan

git stash
git stash branch <branch-name>
Markus Dulghier
sumber
11
Anda harus menyebutkan pintasan git checkout -b <branch-name> yang membuat cabang dan beralih ke sana dalam satu langkah. Ini mungkin kasus penggunaan yang paling umum untuk pengguna pemula dan bahkan pengguna git tingkat lanjut.
Jeremy Wall
21

Mendapatkan Kode terbaru

$ git pull <remote> <branch> # fetches the code and merges it into 
                             # your working directory
$ git fetch <remote> <branch> # fetches the code but does not merge
                              # it into your working directory

$ git pull --tag <remote> <branch> # same as above but fetch tags as well
$ git fetch --tag <remote> <branch> # you get the idea

Itu cukup banyak mencakup setiap kasus untuk mendapatkan salinan kode terbaru dari repositori jarak jauh.

Jeremy Wall
sumber
20

The Pro Git buku gratis adalah jelas favorit saya, terutama bagi pemula.

Peter Mortensen
sumber
18

Git Magic adalah semua yang Anda butuhkan. Dijamin atau uang Anda kembali!

Andrew
sumber
14
Sigh, aku ingin uangku kembali. Buggy software (msysGit) dengan tutorial yang tidak lengkap (GitMagic) == jam kerja, yang hampir tidak gratis
SamGoody
16

Bagaimana Anda menggabungkan cabang?

Jika Anda ingin menggabungkan cabang (misalnya masteruntuk release), pastikan cabang Anda saat ini adalah cabang target yang ingin bergabung menjadi (gunakan git branchatau git statusuntuk melihat cabang Anda saat ini).

Kemudian gunakan

git merge master

(di mana masternama cabang yang ingin Anda gabungkan dengan cabang saat ini).

Jika ada konflik, Anda dapat menggunakan

git diff

untuk melihat konflik yang tertunda Anda harus menyelesaikannya.

Markus Dulghier
sumber
2
Ada git mergetool yang melakukan tiga cara-diff dengan alat favorit Anda (gvimdiff, kdiff3 atau lebih)
Dave Vogt
16

Saya juga menemukan Git Internal sangat berguna. Ini ditulis oleh Scott Chacon (penulis Pro Git, dan pemelihara Buku Komunitas Git). Apa yang saya sukai tentang Git Internal adalah ia berfokus pada konsep pertama dan kemudian perintah , dan karena itu adalah ~ 100 halaman kecil dengan cepat dicerna.

Yordania
sumber
13

Bagaimana Anda melihat riwayat revisi suatu file?

git log -- filename
Pierre-Antoine LaFayette
sumber
12

Cara melacak cabang jarak jauh

Dengan asumsi ada repositori jarak jauh yang Anda gunakan untuk mengkloning repositori lokal Anda dan juga dengan asumsi bahwa ada cabang bernama 'some_branch' pada repositori jarak jauh itu, berikut ini cara melacaknya secara lokal:

# list remote branches
git branch -r

# start tracking one remote branch
git branch --track some_branch origin/some_branch

# change to the branch locally
git checkout some_branch

# make changes and commit them locally
....

# push your changes to the remote repository:
git push
innaM
sumber
Tampaknya di git 1.7 cabang-cabang jarak jauh secara otomatis dilacak ketika Anda membuat cabang lokal dari mereka. Saya tidak tahu dalam versi mana perilaku ini dimulai.
Doppelganger
Sebenarnya, Anda dapat mendaftar semua cabang jarak jauh dengan menggunakangit remote show REMOTENAME
Felipe Sabino
11

Makalah yang sangat bagus untuk memahami bagaimana Git bekerja adalah The Git Parable . Sangat direkomendasikan!

EricSchaefer
sumber
10

Bagaimana Anda membandingkan dua revisi file, atau file Anda saat ini dan revisi sebelumnya?

Bandingkan perintah itu git diff.

Untuk membandingkan 2 revisi file:

$ git diff <commit1> <commit2> <file_name>

Itu berbeda dengan commit1 terhadap commit2; jika Anda mengubah urutan maka file berbeda, yang mungkin tidak seperti yang Anda harapkan ...

Untuk membandingkan file bertahap saat ini dengan repositori:

$ git diff --staged <file_name>

Untuk membandingkan file yang belum dipentaskan saat ini dengan repositori:

$ git diff <file_name>
kret
sumber
9

Mengapa lagi howto? Ada yang benar-benar bagus di internet, seperti panduan git yang sempurna untuk memulai. Ia memiliki tautan yang baik termasuk buku git yang dapat dikontribusikan seseorang (dihosting di hub git) dan yang sempurna untuk tugas kolektif ini.

Di stackoverflow, saya lebih suka melihat trik favorit Anda!

Milik saya, yang baru saya temukan belakangan ini git stash, dijelaskan di sini , yang memungkinkan Anda untuk menyelamatkan pekerjaan Anda saat ini dan pergi ke cabang lain

Sunting: sebagai posting sebelumnya, jika Anda lebih suka format stackoverlow dengan posting sebagai wiki saya akan menghapus jawaban ini

Piotr Lesnicki
sumber
Tidak, jangan dihapus. Jawaban Anda benar-benar valid - dan mengarahkan orang lain ke sumber daya yang baik bukanlah hal yang buruk. Saya juga ingin operasi paling umum yang tercantum di sini, tapi ini sedikit kerja dan saya tidak berharap orang lain melakukannya. Saya akan melakukannya seiring waktu saat saya belajar dan ini akan menjadi referensi bagi saya.
Adam Davis
9

UI Konsol - Tig

Instalasi:

apt-get install tig

Pemakaian

Saat berada di dalam git repo, ketik 'tig', untuk melihat log interaktif, tekan 'enter' pada sembarang log untuk melihat informasi lebih lanjut tentang itu. h untuk bantuan, yang mencantumkan fungsionalitas dasar.

Hal sepele

"Tig" adalah "Git" mundur.

Dean Sebaliknya
sumber
Tidakkah seharusnya itu menjadi "UI Konsol", karena "konsol" dan "grafis" agak .. kontradiktif?
dbr
ini jauh lebih grafis daripada git-log ... namun, itu jauh lebih mudah antarmuka ...
Dean Agak
8

Bagaimana saya bisa membuat cabang di repositori jarak jauh?

Dengan asumsi bahwa Anda telah mengkloning repositori jarak jauh Anda dari beberapa repositori jarak jauh tunggal.

# create a new branch locally
git branch name_of_branch
git checkout name_of_branch
# edit/add/remove files    
# ... 
# Commit your changes locally
git add fileName
git commit -m Message
# push changes and new branch to remote repository:
git push origin name_of_branch:name_of_branch
innaM
sumber
11
mengapa name_of_branch: name_of_branch?
Seun Osewa
Ya kenapa? Sejauh yang saya tahu Anda hanya perlu git push origin name_of_branchdan cabang sudah akan dibuat di remote Anda
Felipe Sabino
yang pertama name_of_branchadalah nama lokal, yang kedua adalah nama cabang jarak jauh (yang diinginkan), jadi bisa jadi local_name_of_branch:remote_name_of_branchjika Anda ingin nama-nama itu berbeda. Jika Anda menginginkannya sama, Anda masih harus menetapkannya seperti b / c git ini tidak membuat asumsi bahwa Anda ingin nama itu sama kecuali Anda mengatakannya (ada metode lain untuk melakukannya juga, namun)
johnny
8

Saya memulai dengan tutorial resmi Git . Saya pikir ini cukup praktis untuk pemula (saya, dan masih, seorang pemula, menurut definisi Anda! Saya hampir tidak memahami makefiles, saya hanya bermain sedikit dengan Apache Subversion, dll.).

Hasen
sumber
8

Bagaimana cara saya menghapus cabang pada repositori jarak jauh?

Lakukan push di remote Anda menggunakan :sebelum nama cabang

git push origin :mybranchname

menjadi originnama remote Anda dan mybranchnamenama cabang yang akan dihapus

http://help.github.com/remotes/

Felipe Sabino
sumber
7

Dorong dan tarik perubahan

Dengan cara yang disederhanakan, lakukan saja git pushdan git pull. Perubahan digabung dan jika ada konflik, git akan memberi tahu Anda dan Anda dapat menyelesaikannya secara manual.

Ketika Anda pertama kali mendorong ke repositori jarak jauh, Anda perlu melakukan git push origin master(master menjadi cabang master). Sejak saat itu Anda hanya melakukan git push.

Dorong tag dengan git push --tags.

dylanfm
sumber
7

Memeriksa Kode

Pertama pergi ke dir kosong, gunakan "git init" untuk membuatnya menjadi repositori, kemudian klon repo jarak jauh ke Anda sendiri.

git clone [email protected]:/dir/to/repo

Di mana pun Anda awalnya mengkloning dari mana "git pull" akan menarik dari secara default.

Dean Sebaliknya
sumber
7
Saya pikir klon melakukan langkah init untuk Anda menghapus kebutuhan untuk menjalankan init terlebih dahulu. git init sebenarnya sebagian besar untuk membuat repositori pertama atau untuk konfigurasi khusus dengan beberapa remote yang ingin Anda atur berbeda dari klon standar.
Jeremy Wall