2013-01-31 40 views
72

Có cách nào để rebase một cam kết đơn lẻ từ một chi nhánh vào chi nhánh khác không?git rebase một cam kết duy nhất

Vì vậy, tôi có

-- -- -- -- -- (Master) 
      \ 
       -- -- -- -- -- XX (Feature-branch) 

và tất cả tôi muốn làm là rebase cam kết cuối cùng của Feature-chi nhánh lên thạc sĩ và rollback một Feature-chi nhánh cam kết.

-- -- -- -- -- XX (Master) 
      \ 
       -- -- -- -- -- (Feature-branch) 

Tôi làm như thế nào?

+3

Nếu bạn có thể rebase bất kỳ số lượng cam kết thì tại sao bạn hỏi về rebasing một duy nhất? Nếu tôi có thể đặt câu hỏi trong SO, tôi sẽ hỏi sự khác biệt giữa rebasing (một commit) và cherry-pick. – Val

+1

Bởi vì tôi không biết rằng anh đào hái có tồn tại, và tôi "Faff về chi nhánh", "Nhận yêu cầu sửa chữa trên chi nhánh khác nhau", "sửa chữa nó", "Cam kết chi nhánh sai", "D'OH! " đủ để đặt câu hỏi là hữu ích. –

Trả lời

76

Bạn có thể chọn cherry để chọn XX để làm chủ.

git checkout master 
git cherry-pick <commit ID of XX> 

Và xóa cam kết cuối cùng khỏi nhánh tính năng bằng git reset.

git checkout Feature-branch 
git reset --hard HEAD^ 
+26

làm thế nào một câu hỏi cụ thể được gọi là 'git rebase ...' có câu trả lời được chấp nhận hơn là chứa lựa chọn anh đào, một khái niệm hoàn toàn khác và đôi khi mỗi se được coi là ô uế? – Bondax

+1

Không chắc chắn nếu điều này có liên quan, nhưng cam kết tôi muốn rebase đã có một số tập tin đã được di chuyển, và 'cherry-pick' làm cho chúng xuất hiện như thể chúng đã bị xóa khỏi vị trí cũ và được tạo tại vị trí mới. Tôi cho rằng việc rebase sẽ thực hiện việc đó, nhưng bây giờ tôi đã đẩy ngược dòng để không thể kiểm tra điều đó. Trong mọi trường hợp, hãy cẩn thận nếu bạn có một tình huống tương tự. – waldyrious

+0

Lưu ý: để đẩy bạn thay đổi trong 'Feature-branch' thành origin bạn sẽ cần' git push -f origin Tính năng-branch' là 'Feature-branch' của bạn bây giờ được coi là 1 commit phía sau' origin/Feature -branch'. – jojo

51
git rebase --onto master branch~1 branch 

này nói "rebase phạm vi các cam kết giữa cuối cùng trước khi ngành và chi nhánh (có nghĩa là, XX cam) trên mũi của chi nhánh chủ"

Sau hoạt động này branch đầu được di chuyển trên phạm XX, do đó bạn muốn cài đặt nó trở lại với

git checkout branch 
git reset --hard [email protected]{1}^ 

nào nói "reset đầu chi nhánh để cam kết trước khi trạng thái trước đó"

Vì vậy, một lựa chọn anh đào là một giải pháp đơn giản ...

+3

Điều này dường như không hiệu quả đối với tôi, tôi mất các cam kết trước XX và nhánh được rebased để làm chủ với một cam kết duy nhất, nhưng tôi không bao giờ sử dụng '--onto' trước đây vì vậy tôi có thể làm điều gì sai. BTW OP cho biết rebase nhưng có vẻ như anh ấy muốn làm một lựa chọn anh đào. – tewe

+1

lỗi của tôi, rebase thực sự di chuyển các chi nhánh trên tổng thể, nó đã được thiết lập lại – CharlesB

+0

sự khác biệt thực tế giữa giải pháp này và [một bởi tewe] (https://stackoverflow.com/a/14635752/452775) là gì? – Lii

1

@Trả lời của khách hàng là chính xác. Dù sao tôi đã kết thúc sử dụng này rất nhiều lần, hầu hết tất cả để rebase cấu hình cụ thể về một dự án

 
    * a8f9182 (HEAD -> production) production configuration 
    | * daa18b7 (pre) preproduction configuration 
    |/ 
    | * d365f5f (local) local configuration 
    |/ 
    * 27d2835 (dev) amazing new feature that will save the world 
* | 56d2467 (master) boring state of the art for project 
|/ 

mà tôi tạo ra một lệnh mới cho nó:

 
$ cat ~/bin/git-rebaseshot 
COMMIT=$1 
DEST=${2:-HEAD} 
git rebase ${COMMIT}^ ${COMMIT} --onto $DEST 

thông thường bạn muốn tự động hoàn thành tên chi nhánh cho lệnh đó, vì vậy nó thêm nguồn chức năng này (thêm vào .bashrc hoặc .profile):

 
_git_rebaseshot() 
{ 
    __gitcomp_nl "$(__git_refs)" 
} 

git autocomplete sẽ tìm kiếm nó

.210

bạn có thể sử dụng lệnh này như sau:

# rebase config on prepro on actual HEAD 
$ git rebaseshot prepro 
# rebase config on local onto dev 
$ git rebaseshot local dev 
# rebase production config on master 
$ git rebaseshot pro master 

Khi bạn chia các tính năng một cách chính xác, possibities là vô tận.

 
* a8f9182 (HEAD -> postgres) BBDD config 
* a8f9182 (local) local config 
* a8f9182 (debug) log level config 
* a8f9182 (dev) new feature 
| 

Tôi đoán đây là những gì quilt những người thích làm.

lệnh này sẽ làm việc nào với bất cứ điều gì sha/ref bạn cung cấp:

$ git rebaseshot <Feature branch> master 
$ git rebaseshot <commit of XX> master 
+0

//, Bạn có thể liên kết với bất kỳ dự án nào mà chúng tôi có thể thấy điều này đang hoạt động không? –

+0

Đối với bản chất của nó, các chi nhánh có sẵn cho rebaseshot không cam kết bên ngoài repo địa phương. Chỉ cần tạo ra một số chi nhánh trên đầu trang của chủ (mức độ đăng nhập, kết nối cơ sở dữ liệu, cấu hình) và sử dụng lệnh giữa chúng. Là đồng bằng để xem hiệu quả. – albfan

+0

//, tôi gặp phải một số sự cố. Tôi sẽ thử lại lần nữa. –

6

Nó khá đơn giản để làm thực sự. Giải pháp là để làm một rebase tương tác và "thả" tất cả các cam kết bạn không muốn bao gồm trong rebase.

git rebase -i <target_branch> nơi target_branch là chi nhánh mà bạn muốn rebase vào

Sau đó, bạn sẽ chỉnh sửa các tập tin đó được mở ra và pick các cam kết bạn muốn và drop (hoặc d cho ngắn) tất cả các cam kết bạn don' Tôi muốn mang theo.

+0

IMO một giải pháp tốt hơn nhiều, và nó thực sự giải quyết các câu hỏi. – GabrielOshiro

Các vấn đề liên quan