2009-04-21 27 views
30

Gần đây tôi đã sửa chữa repo git của mình và muốn tìm hiểu xem có biện pháp khắc phục nào không.Tạo chi nhánh git, và hoàn nguyên về trạng thái ngược dòng

Thiết lập của tôi là thế này:

Central repo on github. 
Personal repo on github (which is a fork of Central) 
    +Central is setup as remote (upstream/master) 
    +Master branch (origin/master) 
    +Feature branch (origin/feature) 

công việc của tôi là như thế này:

Need to fix something in Central: 
    1. checkout Master 
    2. Make changes 
    3. Pull from upstream/master and merge 
    3. Commit, push to upstream/master 

Need to work on a New Feature: 
    1. Checkout/Create Feature branch 
    2. Work work work 
    3. Pull from upstream/master and merge 
    4. Commit, push to upstream/master 

Bằng cách này tôi luôn luôn có một trạng thái nguyên sơ của Trung ương trong ngành Thạc sĩ của tôi.

Bây giờ những gì tôi đã làm đã bắt đầu làm việc trên nhánh chính thay thế. Vì vậy, tôi đã thực hiện thay đổi cho chủ nhân của tôi và không còn có thể chi nhánh từ nó để có được một bản sao của Trung ương. Bất cứ khi nào tôi cần phải thực hiện và đẩy một số bản sửa lỗi cho Trung ương, tôi phải sao chép miền Trung vào một thư mục khác và làm việc từ đó.

Câu hỏi của tôi: Có cách nào để "hoàn nguyên" chủ nhân của tôi thành một bản sao giống hệt Trung ương hay không, trong khi di chuyển tất cả những thay đổi tôi đã thực hiện trên Master của mình sang một nhánh khác (nói tính năng)?

Tôi biết điều đó gây nhầm lẫn và tôi sẽ đánh giá cao bất kỳ trợ giúp nào. Tôi sẽ làm rõ nếu có gì không rõ ràng.

Trả lời

47

Vâng Giải pháp là khá đơn giản, gợi ý bởi Pat NOTZ và Bombe.

#Make sure we're on the master branch 
$ git checkout master 

# Make a new branch to hold the work I've done 
$ git branch old_master 
# Save this branch on my remote repo (for backup) 
$ git checkout old_master 
$ git push origin old_master 

# Reset my local master back to match the commit just before I started 
# working on my new feature 
$ git checkout master 
$ git reset --hard 2aa93842342342 
# Get it to be the same as my Central 
$ git pull upstream master 

# Now DELETE my master on my remote repo 
$ git push origin :master 
# And recreate it 
$ git push origin master 

# Branch created! 
#* [new branch]  master -> master 

# 

Bây giờ tôi có hai nhánh tốt đẹp: master và old_master. Với chủ nhân là một bản sao của Trung ương của tôi, để sửa chữa để sản xuất, và old_master giữ tất cả các công việc mà tôi đã làm trước đó!

Cảm ơn!

+1

Cảm ơn bạn đã theo dõi giải pháp của mình. Tôi chỉ đang cố gắng phân loại tình huống của bạn - vui vì bạn đã tìm ra nó. –

+5

Tôi nghĩ thay vì lệnh thứ 4 của bạn ở đó, "git push old_master origin old_master", bạn nên có "git push origin old_master"? Tôi hy vọng điều đó đúng, bởi vì đó là những gì dường như làm việc cho tôi. Nếu không, tôi nhận được thông báo lỗi: "fatal: 'old_master' có vẻ như không phải là kho git" –

+4

Tôi không thể "git push origin: master". Bài đăng này giải thích cách giải quyết vấn đề đó. http://matthew-brett.github.com/pydagogue/gh_delete_master.html Điều quan trọng là, hãy đảm bảo rằng chính không phải là nhánh mặc định trên github. Một chính sách tốt nếu bạn đang làm việc trên một repo chia hai. – pduey

3

Chính xác những gì bạn có ý nghĩa gì bởi

Tôi sai lầm [lên] thạc sĩ của tôi và có thể không còn chi nhánh từ nó.

Bạn luôn có thể tạo chi nhánh mới từ bất kỳ cam kết nào trong kho lưu trữ của mình, bất kể "sai lầm" như thế nào - theo cách mà Git không có khái niệm. Về cơ bản, bạn có thể hoàn nguyên kho lưu trữ của mình về bất kỳ trạng thái nào trước đây vì Git sẽ không xóa một cách rõ ràng bất kỳ đối tượng nào, nó sẽ chỉ thu thập rác các đối tượng không được tham chiếu (mọi thứ bây giờ và sau đó). Vì vậy, bạn chỉ cần tìm hiểu xem kho lưu trữ của bạn trông như thế nào. gitk hoặc git log có thể giúp bạn ở đó.

Sau khi bạn khôi phục kho lưu trữ cục bộ của mình về trạng thái bạn thích, bạn có thể chỉ cần đẩy nó trở lại kho lưu trữ công cộng trung tâm của bạn. Nếu điều đó dẫn đến cú đẩy không tiến nhanh, bạn có thể cần phải chỉ định cờ --force khi đẩy.

+0

Xin chào, tôi có nghĩa là tôi không còn có thể chi nhánh từ nó để lấy một bản sao của Trung tâm, vì vậy tôi có thể bắt đầu làm việc trên một tính năng mới. Về đề xuất của bạn, tôi nghĩ về điều đó - nhưng điều đó sẽ khiến tôi mất tất cả công việc tôi đã làm với chủ nhân của mình. Nó sẽ không? Cảm ơn. – drozzy

16
# Make sure we're on the master branch 
$ git checkout master 

# Make a new branch to hold the work I've done 
$ git branch old_master 

# Reset my local master back to match origin/master 
$ git reset --hard origin/master 

Bây giờ bạn có thể kiểm old_master và sử dụng nó giống như bạn đã làm feature chi nhánh của bạn

+0

Nguồn gốc/chủ đề cập đến kho lưu trữ từ xa của Master của tôi. Nhưng tôi đã PUSHED thay đổi của tôi để repo github của tôi. Điều tôi cần phải đặt lại thành luồng ngược/chủ nơi repo Trung tâm của tôi. Có cách nào để làm điều đó? – drozzy

+0

Không ngạc nhiên, 'git reset --hard upstream/master' dường như hoạt động tốt (nếu bạn đã thiết lập ngược dòng để trỏ vào repo chính xác). – starwed

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