Câu hỏi Làm thế nào để thay thế nhánh master trong git, hoàn toàn, từ một nhánh khác? [bản sao]


Có thể trùng lặp:
Thay đổi nhánh hiện tại thành master 

Tôi có hai chi nhánh trong repo git của tôi:

  1. bậc thầy
  2. seotweaks (được tạo ban đầu từ chính)

Tôi đã tạo ra seotweaks với ý định nhanh chóng sáp nhập nó trở lại master, tuy nhiên đó là 3 tháng trước và mã trong nhánh này là 13 phiên bản trước master, nó đã có hiệu quả trở thành nhánh làm việc của chúng tôi như tất cả các mã trong master bây giờ ít nhiều lỗi thời.

Thực hành rất tồi tôi biết, bài học kinh nghiệm.

Bạn có biết cách tôi có thể thay thế tất cả nội dung của master chi nhánh với những người trong seotweaks?

Tôi có thể xóa mọi thứ trong master và hợp nhất, nhưng điều này không giống như thực hành tốt nhất.


1287
2018-05-19 03:06


gốc


re: cờ trùng lặp chính xác-- điều đó có thể đúng, nhưng câu trả lời của ergosys bên dưới tốt hơn câu trả lời được chấp nhận cho câu hỏi đó, IMO - mikermcneil
lưu ý nó có thể được khai báo là trùng lặp nhưng là lần truy cập đầu tiên trên tìm kiếm trên web cho "git delete branch master" - peterk
Những điểm này hiếm khi quan trọng với zealot trùng lặp chuyên dụng. - geotheory
Ngoài ra, câu hỏi này là tốt hơn worded và thiếu sự nhầm lẫn gây ra bởi "thêm" bình luận thêm vào câu hỏi sau khi câu trả lời đã bắt đầu. - Rob Osborne


Các câu trả lời:


Bạn sẽ có thể sử dụng chiến lược hợp nhất "của chúng ta" để ghi đè lên tổng thể với các seotweaks như thế này:

git checkout seotweaks
git merge -s ours master
git checkout master
git merge seotweaks

Kết quả phải là chủ của bạn bây giờ về cơ bản là seotweaks.

(-s ours là viết tắt của --strategy=ours)

Từ tài liệu về chiến lược 'của chúng ta':

Điều này giải quyết bất kỳ số lượng đầu, nhưng cây kết quả của việc hợp nhất luôn luôn là của người đứng đầu chi nhánh hiện tại, có hiệu quả bỏ qua tất cả các thay đổi từ tất cả các ngành khác. Nó có nghĩa là để được sử dụng để thay thế lịch sử phát triển cũ của các chi nhánh phụ. Lưu ý rằng điều này khác với tùy chọn -Xours cho chiến lược hợp nhất đệ quy.


2242
2018-05-19 04:51



Có thể là quá muộn để thêm câu hỏi này nhưng những gì là sai với điều này: git checkout master, git merge -s của họ seotweaks - tiết kiệm một vài bước. - Subu Sankara Subramanian
@ Jelel Berger, các tùy chọn hợp nhất đệ quy sẽ kết hợp hai nhánh, ủng hộ "của họ" hoặc "của chúng ta" chỉ xung đột. Vì vậy, bạn sẽ nhận được thay đổi từ cả hai nhánh. - ergosys
Điều này không hiệu quả với tôi. Khi tôi làm "git merge -s ours master" từ chi nhánh khác, tôi nhận được "Đã cập nhật". Bất cứ điều gì khác tôi có thể thử? - elsurudo
@elsurudo Có thể không phải là lỗi: stackoverflow.com/a/634575/240633 - ergosys
Không làm việc cho tôi - pratnala


Điều gì về việc sử dụng git branch -m để đổi tên nhánh master thành một nhánh khác, sau đó đổi tên nhánh seotweaks thành master? Một cái gì đó như thế này:

git branch -m master old-master
git branch -m seotweaks master
git push -f origin master

Điều này có thể loại bỏ các cam kết trong master gốc, vui lòng kiểm tra chủ gốc của bạn trước khi chạy git push -f origin master.


373
2018-05-19 03:11



@ Jason: Thử git push -f origin master - Koraktor
Đây có lẽ là cách tốt nhất để thực hiện cập nhật bắt buộc sau khi đảm bảo rằng tổng thể của bạn có thể được thay thế hoàn toàn - Hrishi
Nó có thể là giá trị giải thích rằng câu trả lời này có thể loại bỏ các cam kết trong bản gốc master chi nhánh. Trong khi giải pháp của ergosys thực hiện hợp nhất và do đó giữ lại tất cả lịch sử master. - florisla
Crap Tôi chỉ mất tất cả các cam kết trong bản gốc. - moberme
@moberme bạn có thể làm git checkout old-master && git push origin old-master để tạo một chi nhánh với chủ cũ. - Sander Visser


Bạn có thể đổi tên / loại bỏ chủ trên điều khiển từ xa, nhưng đây sẽ là một vấn đề nếu rất nhiều người đã dựa trên công việc của họ trên nhánh chủ từ xa và đã kéo nhánh đó vào kho lưu trữ cục bộ của họ.
Đó có thể không phải là trường hợp ở đây vì mọi người dường như đang làm việc trên chi nhánh 'seotweaks'.

Trong trường hợp đó, bạn có thể:
git remote --show có thể không hoạt động. (Làm một git remote show để kiểm tra cách từ xa của bạn được khai báo trong repo cục bộ của bạn. Tôi sẽ giả sử 'origin')
(Về GitHub, house9 nhận xét: "Tôi phải thực hiện thêm một bước nữa, nhấp vào 'Admin'trên GitHub và đặt'Default Branch'đến một thứ khác ngoài'master', sau đó đặt nó trở lại sau đó ")

git branch -m master master-old  # rename master on local
git push origin :master          # delete master on remote
git push origin master-old       # create master-old on remote
git checkout -b master seotweaks # create a new local master on top of seotweaks
git push origin master           # create master on remote

Nhưng một lần nữa:

  • nếu người dùng khác cố gắng kéo trong khi tổng thể bị xóa trên điều khiển từ xa, quá trình kéo của họ sẽ không thành công ("không cần phải thực hiện điều khiển từ xa")
  • khi master được tái tạo trên remote, một pull sẽ cố gắng hợp nhất master mới trên master (hiện tại cũ) của chúng: rất nhiều xung đột. Họ thực sự cần reset --hard chủ nhân địa phương của họ đến nhánh từ xa / chủ mà họ sẽ tìm nạp và quên chủ nhân hiện tại của họ.

61
2018-05-19 03:57



Cảm ơn bạn đã trả lời chi tiết, khi tôi chạy 'git push remote: master' Tôi gặp lỗi - 'remote' không xuất hiện như một kho git. - Jason
@ Jason: Tôi đã thay đổi thành 'origin' có thể là tên mặc định được cung cấp cho repo từ xa của bạn. - VonC
@ VonC: Tôi đang cố gắng làm điều đó trên kho lưu trữ git-hub, nhưng khi cố gắng thực hiện 'git push origin: master' tôi nhận được một thông báo '[remote reject] master (xóa nhánh hiện tại bị cấm)'. Đối với lý do tại sao tôi làm điều đó ... về cơ bản tôi đã trộn lẫn nhiều thứ, nhập khẩu hai lần cùng một bản vá thông qua giao diện github và đẩy dòng lệnh, sau đó nhận mọi thứ trở lại làm việc bằng cách hợp nhất thủ công. Sau đó tôi cũng tạo ra một nhánh khác với một lịch sử sạch sẽ, nhưng quá trễ ... dù sao đi nữa. Vì nó nằm trong kho thử nghiệm cá nhân của tôi nên tôi là người duy nhất bị ảnh hưởng. - kriss
@kriss: GitHub sẽ từ chối theo mặc định bất kỳ lịch sử ghi đè / xóa nào, trừ khi bạn ép buộc: git push -f origin :master. - VonC
cảm ơn đây là một trợ giúp lớn; Tôi phải thực hiện thêm một bước nữa, nhấp vào nút 'Quản trị' trên github và đặt 'Chi nhánh mặc định' thành một cái gì đó khác 'master', sau đó đặt lại sau - house9


vì seotweaks ban đầu được tạo ra như một nhánh từ master, việc sáp nhập nó trở lại là một ý tưởng hay. tuy nhiên, nếu bạn đang ở trong tình huống mà một trong các chi nhánh của bạn không thực sự là một nhánh của chủ hoặc lịch sử của bạn quá khác biệt đến mức bạn chỉ muốn xóa bỏ nhánh chủ để ủng hộ nhánh mới mà bạn đã thực hiện công việc với bạn có thể làm điều này:

git push [-f] origin seotweaks:master

điều này đặc biệt hữu ích nếu bạn gặp phải lỗi này

! [remote rejected] master (deletion of the current branch prohibited)

và bạn không sử dụng github và không có quyền truy cập vào tab "Quản trị" để thay đổi nhánh mặc định cho repo từ xa của bạn. hơn nữa, điều này sẽ không gây ra thời gian xuống hoặc điều kiện cuộc đua như bạn có thể gặp phải bằng cách xóa chủ:

git push origin :master

21
2017-07-25 20:44



Không hoạt động trên Heroku:! [bị từ chối] <new_branch> -> lỗi chính (không chuyển tiếp nhanh): không thể đẩy một số tham chiếu đến '<some_git> .git' - shaioz
git push -f origin seotweaks: master làm việc cho tôi - Tom Andersen
Câu trả lời tuyệt vời: đẩy buộc hiển thị cho git ai là ông chủ. - nbloqs


Tôi thấy đây là cách tốt nhất để thực hiện việc này (tôi gặp sự cố với máy chủ của mình không cho phép tôi xóa)

Trên máy chủ lưu trữ kho gốc, nhập thông tin sau từ thư mục bên trong kho lưu trữ:

git config receive.denyDeleteCurrent ignore

Trên máy trạm của bạn:

git branch -m master vabandoned                 # rename master on local
git branch -m newBranch master                  # locally rename branch newBranch to master
git push origin :master                         # delete the remote's master
git push origin master:refs/heads/master        # push the new master to the remote
git push origin abandoned:refs/heads/abandoned  # push the old master to the remote

Quay lại máy chủ lưu trữ kho gốc:

git config receive.denyDeleteCurrent true

ghi nhận tác giả của trang này

http://www.mslinn.com/blog/?p=772


1
2017-09-28 13:13



Đối với tôi master branch là nhánh mặc định vì vậy tôi đã thay đổi branch mặc định thành nhánh 'develop' và xóa master branch và tạo lại master từ nhánh mong muốn. Sau đó nếu bạn muốn bạn có thể làm cho nhánh 'master' trở thành nhánh mặc định của bạn. - Sharad