2011-06-23 50 views
5

Tôi rất bối rối, tôi đã đọc một số bài đăng, blog và bài viết và không biết phải đi đâu. Tôi đang sử dụng một repo máy chủ svn mà tôi kéo xuống với git svn và làm việc trên. Tôi hiện là người duy nhất phát triển điều này (tức là không có thay đổi ngược dòng).git merge vs rebase sử dụng git svn

Vì vậy, tôi có một chi nhánh git chủ đề địa phương vacation, mà tôi cần phải hợp nhất trở lại vào chủ để dcommit, nhưng tôi không muốn để squash tất cả các cam kết thành một lớn.

Tôi đã cố gắng thực hiện git rebase -i master và nó đã xóa 90% thay đổi của tôi.

để tôi làm một

git checkout master 
git rebase vacation 
git svn docmmit 

Hoặc một

git checkout vacation 
git rebase master 
git checkout master 
git merge vacation --ff-only 
git svn docmmit? 

tôi sợ như vậy b/c gì đã xảy ra khi tôi đã cố gắng trước có thể ai đó hãy giải thích ngắn gọn những gì tôi nên làm và tại sao tôi phải làm theo cách đó?

Trả lời

4

vì vậy tôi nghĩ rằng tôi đã tìm ra.

git checkout vacation 
git rebase master 
[ masters's chages put behind this branches, replay every commit ] 
git checkout master 
git merge --ff-only vacation 
git svn dcommit 
[ each change goes into svn as seperate commit ] 

Tôi không có thay đổi ngược dòng, nhưng đây chính xác là những gì tôi muốn.

+1

Vâng, đây là điều đúng để làm. –

3

Bạn nên hợp nhất hoặc chọn anh đào thành chương trình chính không được rebase.

Đối với lý do tại sao, đó là câu hỏi đặt hàng. Rebase ngụ ý bạn muốn thay đổi lịch sử để làm cho nhánh chủ đề của bạn xuất hiện trước master trong lịch sử. Nếu bạn hợp nhất hoặc chọn cam kết, thì nó sẽ thêm các cam kết của bạn lên trên đầu trang của tổng thể.

Vì vậy, một chu trình hoàn thành sẽ là một cái gì đó giống như

git checkout -b vacation 
[make changes] 
git commit -a -m "Commit message" 
git checkout master 
git merge vacation 
git svn dcommit 

Để giải thích rebase đầy đủ hơn một ví dụ từ thiết lập cá nhân của tôi: Ngoài làm chủ Tôi cũng duy trì một công việc chi nhánh địa phương mà tôi sử dụng như là cơ sở cho tôi cấu hình cục bộ của dự án. Nó có những thứ như các tệp thuộc tính tùy chỉnh mà tôi không bao giờ muốn cam kết. Tôi cần phải ghi nhớ điều này đồng bộ với các chi nhánh chủ vì vậy tôi làm điều này bắt đầu từ bậc thầy:

git svn rebase 
git checkout work 
git rebase master 

Bây giờ git dựng lại lịch sử của chi nhánh công việc đặt tất cả các cấu hình địa phương cam kết ở phần đầu của ngăn xếp. Nó reoreat the BASEd nhánh trên nhánh master. Nếu tôi phát hành

git merge master 

thay vì rebasing thì kết quả cho lamen sẽ giống nhau nhưng lịch sử sẽ rất khác. Hai lịch sử sẽ được giải quyết, có thể dẫn đến việc hợp nhất các commit, thay vì một commit dựa trên đầu kia.

+0

bất kỳ ai được giảm giá có thể giải thích lý do tại sao? – loosecannon

+0

cũng chỉnh sửa không làm rõ, Thats những gì tôi muốn, vì vậy khi tôi hợp nhất tôi có một lịch sử tuyến tính mà svn hiểu, và không hợp nhất cam kết – loosecannon