Tôi đã sử dụng Perforce trong một số năm. Tôi muốn chuyển sang sử dụng git cho mã cá nhân của mình, nhưng tất cả các hướng dẫn về git mà tôi đã xem đều cho rằng bạn là người kiểm soát nguồn hoàn chỉnh n00b (điều này khiến chúng trở nên vô cùng tẻ nhạt) hoặc bạn đã quen với svn (mà tôi không phải).
Tôi biết p4 và tôi cũng hiểu ý tưởng đằng sau một hệ thống kiểm soát nguồn phân tán (vì vậy tôi không cần quảng cáo chiêu hàng, cảm ơn). Những gì tôi muốn là một bảng dịch từ lệnh p4 sang các lệnh git tương đương, cũng như các lệnh "không thể sống thiếu" không có lệnh tương đương p4.
Vì tôi nghi ngờ mọi người dùng p4 sử dụng một tập hợp con khác nhau của p4, đây là một số điều tôi thường xuyên làm trong p4 mà tôi muốn có thể thực hiện trong git mà không rõ ràng ngay lập tức từ các tài liệu tôi đã xem :
- tạo nhiều danh sách thay đổi đang chờ xử lý trong một ứng dụng khách. (
p4 change
) - chỉnh sửa danh sách thay đổi đang chờ xử lý. (còn nữa
p4 change
) - xem danh sách tất cả các danh sách thay đổi đang chờ xử lý của tôi (
p4 changes -s pending
) - danh sách tất cả các tệp đã thay đổi trong ứng dụng khách của tôi (
p4 opened
) hoặc trong danh sách thay đổi đang chờ xử lý (p4 describe
) - thấy sự khác biệt của danh sách thay đổi đang chờ xử lý (tôi sử dụng tập lệnh trình bao bọc cho điều này sử dụng
p4 diff
vàp4 describe
) - cho một tệp nhất định, hãy xem danh sách thay đổi đã gửi nào ảnh hưởng đến dòng nào (
p4 annotate
) - đối với một tệp nhất định, hãy xem danh sách mô tả danh sách thay đổi đã ảnh hưởng đến tệp (
p4 log
) - gửi danh sách thay đổi đang chờ xử lý (
p4 submit -c
) - hủy bỏ danh sách thay đổi đang chờ xử lý (
p4 revert
)
Rất nhiều trong số này xoay quanh "người thay đổi". "changelist" là thuật ngữ p4. Thuật ngữ tương đương git là gì?
Có vẻ như các nhánh có thể là thứ mà người dùng git sử dụng thay cho thứ mà p4 gọi là danh sách thay đổi. Một chút khó hiểu, vì p4 cũng có một cái gì đó được gọi là một nhánh mặc dù chúng dường như chỉ là những khái niệm liên quan mơ hồ. (Mặc dù tôi luôn nghĩ rằng khái niệm nhánh của p4 khá kỳ lạ nhưng nó lại khác với khái niệm RCS cổ điển về một nhánh.)
Dù sao thì ... tôi không chắc làm thế nào để hoàn thành những gì tôi thường làm trong danh sách thay đổi p4 với các nhánh của git. Trong p4, tôi có thể làm điều gì đó như sau:
$ p4 edit a.txt
$ p4 change a.txt
Change 12345 created.
Tại thời điểm này, tôi có một danh sách thay đổi có chứa a.txt. Tôi có thể chỉnh sửa mô tả và tiếp tục làm việc mà không cần gửi danh sách thay đổi. Ngoài ra, nếu hóa ra tôi cần thực hiện một số thay đổi đối với một số tệp khác, chẳng hạn như sửa lỗi trong một số lớp khác của mã, tôi có thể thực hiện điều đó trong cùng một ứng dụng khách:
$ p4 edit z.txt
$ p4 change z.txt
Change 12346 created.
Bây giờ tôi có hai danh sách thay đổi riêng biệt trong cùng một khách hàng. Tôi có thể làm việc trên những thứ này đồng thời và tôi không cần phải làm bất cứ điều gì để "chuyển đổi giữa" chúng. Khi đến thời điểm cam kết, tôi có thể gửi chúng một cách riêng biệt:
$ p4 submit -c 12346 # this will submit the changes to z.txt
$ p4 submit -c 12345 # this will submit the changes to a.txt
Tôi không thể tìm ra cách sao chép điều này trong git. Từ các thử nghiệm của tôi, nó dường như không git add
được liên kết với nhánh hiện tại. Theo như tôi có thể nói, khi tôi git commit
sẽ cam kết tất cả các tệp mà tôi đã git add
-ed bất kể tôi đang ở chi nhánh nào vào thời điểm đó:
$ 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
Trong ví dụ này, các nhánh aardvark và zebra dường như chứa chính xác cùng một tập hợp các thay đổi và dựa trên kết quả của git status
nó, có vẻ như việc thực hiện một cam kết trong một trong hai sẽ có cùng tác dụng. Tôi có làm điều gì sai?