Saya telah menggunakan Perforce selama beberapa tahun. Saya ingin beralih menggunakan git untuk kode pribadi saya, tetapi semua tutorial git yang saya lihat berasumsi bahwa Anda adalah kontrol sumber lengkap n00b (yang membuatnya sangat membosankan) atau Anda terbiasa svn (yang bukan saya).
Saya tahu p4, dan saya juga memahami ide di balik sistem kendali sumber terdistribusi (jadi saya tidak perlu promosi dagang, terima kasih). Yang saya inginkan adalah tabel terjemahan dari perintah p4 ke perintah git yang setara, serta perintah "tidak bisa hidup tanpanya" yang tidak memiliki padanan p4.
Karena saya curiga setiap pengguna p4 menggunakan subset berbeda dari p4, berikut adalah beberapa hal yang biasa saya lakukan di p4 yang ingin saya lakukan di git yang tidak langsung terlihat dari dokumen yang saya lihat :
- membuat beberapa daftar perubahan tertunda dalam satu klien. (
p4 change
) - edit daftar perubahan yang tertunda. (juga
p4 change
) - lihat daftar semua daftar perubahan saya yang tertunda (
p4 changes -s pending
) - daftar semua file yang diubah di klien saya (
p4 opened
) atau dalam daftar perubahan yang tertunda (p4 describe
) - lihat perbedaan dari daftar perubahan yang tertunda (saya menggunakan skrip pembungkus untuk ini yang menggunakan
p4 diff
danp4 describe
) - untuk file tertentu, lihat daftar perubahan yang dikirimkan yang mempengaruhi baris mana (
p4 annotate
) - untuk file tertentu, lihat daftar deskripsi dari daftar perubahan yang mempengaruhi file (
p4 log
) - kirimkan daftar perubahan yang tertunda (
p4 submit -c
) - batalkan daftar perubahan yang tertunda (
p4 revert
)
Banyak dari ini berputar di sekitar "daftar perubahan". "changelist" adalah terminologi p4. Apa istilah setara git?
Kedengarannya seperti branch mungkin adalah apa yang digunakan pengguna git sebagai pengganti dari apa yang disebut daftar perubahan p4. Agak membingungkan, karena p4 juga memiliki sesuatu yang disebut cabang meskipun tampaknya hanya konsep yang terkait secara samar. (Meskipun saya selalu berpikir konsep p4 tentang sebuah cabang cukup aneh, ini berbeda lagi dari konsep RCS klasik tentang sebuah cabang.)
Bagaimanapun ... Saya tidak yakin bagaimana mencapai apa yang biasanya saya lakukan di daftar perubahan p4 dengan cabang git. Di p4 saya bisa melakukan sesuatu seperti ini:
$ p4 edit a.txt
$ p4 change a.txt
Change 12345 created.
Pada titik ini saya memiliki daftar perubahan yang berisi a.txt. Saya dapat mengedit deskripsi dan terus bekerja tanpa mengirimkan daftar perubahan. Selain itu, jika ternyata saya perlu membuat beberapa perubahan pada beberapa file lain, seperti misalnya perbaikan bug di beberapa lapisan kode lainnya, saya dapat melakukannya di klien yang sama:
$ p4 edit z.txt
$ p4 change z.txt
Change 12346 created.
Sekarang saya memiliki dua daftar perubahan terpisah di klien yang sama. Saya dapat mengerjakan ini secara bersamaan, dan saya tidak perlu melakukan apa pun untuk "beralih di antara" keduanya. Jika tiba waktunya untuk berkomitmen, saya dapat mengirimkannya secara terpisah:
$ p4 submit -c 12346 # this will submit the changes to z.txt
$ p4 submit -c 12345 # this will submit the changes to a.txt
Saya tidak tahu cara mereplikasi ini di git. Dari percobaan saya, tidak tampak yang git add
terkait dengan cabang saat ini. Sejauh yang saya tahu, kapan saya git commit
akan mengkomit semua file yang saya git add
-ed tidak peduli di cabang mana saya berada saat itu:
$ git init
Initialized empty Git repository in /home/laurence/git-playground/.git/
$ ls
a.txt w.txt z.txt
$ git add -A .
$ git commit
Initial commit.
3 files changed, 3 insertions(+), 0 deletions(-)
create mode 100644 a.txt
create mode 100644 w.txt
create mode 100644 z.txt
$ vi a.txt z.txt
2 files to edit
$ git status
# On branch master
# Changed but not updated:
# (use "git add <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
#
# modified: a.txt
# modified: z.txt
#
no changes added to commit (use "git add" and/or "git commit -a")
$ git branch aardvark
$ git checkout aardvark
M a.txt
M z.txt
Switched to branch 'aardvark'
$ git add a.txt
$ git checkout master
M a.txt
M z.txt
Switched to branch 'master'
$ git branch zebra
$ git checkout zebra
M a.txt
M z.txt
Switched to branch 'zebra'
$ git add z.txt
$ git status
# On branch zebra
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
#
# modified: a.txt
# modified: z.txt
#
$ git checkout aardvark
M a.txt
M z.txt
Switched to branch 'aardvark'
$ git status
# On branch aardvark
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
#
# modified: a.txt
# modified: z.txt
Dalam contoh ini, cabang aardvark dan zebra tampaknya berisi sekumpulan perubahan yang persis sama, dan berdasarkan keluarannya git status
tampaknya melakukan komit di salah satu cabang tersebut akan memiliki efek yang sama. Apakah saya melakukan sesuatu yang salah?