這個問題可能已經回答了,但我找不到。
我有一個正在作業的分支,但我沒有完成在這個分支上的作業。現在我需要使用完全不同分支上的預構建工具。
我的分支上根本看不到那個腳本,但我需要運行它才能得到一些東西,繼續在我的分支上作業。這里存在三個問題:
- 我不想結帳到另一個分支。我想一直在自己的分支上作業
- 我不想在完成之前提交任何事情
- 我想使用另一個分支中在我自己的分支上不可見的東西
這怎么可能,有可能嗎?
uj5u.com熱心網友回復:
有很多方法可以解決這個問題。它們都歸結為你現在太努力了。?? 輕松一點!
讓我們從這個開始:在 Git 中,分支基本上是不相關的;重要的是提交。提交包含兩件事:每個檔案的完整快照,以及一些元資料(例如有關誰提交的資訊)。我們不會在這里詳細介紹,只是要注意任何給定提交的內容都是 100% 只讀的:任何提交都不能被更改,即使是 Git 本身也不能。
當你在 Git 中作業時,你首先要提取一些提交。也就是說,你運行or ,或者甚至。這會從一個特定的提交中提取每個檔案的完整副本。(存盤在提交中的檔案是一種特殊的、只讀的、壓縮的、Git 化的、去重的格式,只有 Git 可以讀取,實際上沒有任何東西可以寫入,這使得它們除了這個提取程序之外毫無用處。)但是:提交是否提取?git checkout branchgit switch branchgit checkout hash-ID
提交由哈希 ID 標識。哈希 ID 又大又丑,人類無法使用,除了使用滑鼠或類似工具進行剪切和粘貼。所以你可以這樣做——就像這種情況一樣——或者你可以使用分支名稱和其他類似的名稱(例如標簽名稱)。每個名稱都是拼寫一個哈希 ID 的一種方式,而無需輸入原始哈希 ID。分支名稱本質上“意味著”分支上的最新提交。git checkout hash-ID
現在您已經擁有了該提交的檔案,您可以處理/使用它們,運行git add以更新建議的下一個提交,然后運行git commit,Git 會進行新的提交并自動更新分支名稱(假設您使用的是分支名稱)。所以這就是你現在的情況:
我有一個正在作業的分支,但我沒有完成在這個分支上的作業。
這不是很精確。您的意思是:您通過分支名稱檢查了一些特定的提交,然后您開始作業。您還沒有準備好進行新的提交。您仍然“在分支上”(因此您用來進行新提交的任何提議的新提交都將更新分支名稱以記住新的最新提交)并且您希望保持這種狀態。
現在我需要使用完全不同分支上的預構建工具。
讓我們也使這個更精確。您的意思是您想要獲取存盤在其他一些提交中的某個檔案(shell 腳本、命令等) 。該其他提交的哈希 ID 存盤在某個其他分支名稱中,例如toolbranch.
為什么這一切都很重要
git show您可以使用或輕松訪問任何提交中的任何單個檔案git cat-file -p。例如,如果您知道您需要的提交哈希 ID 是并且存盤在該提交a123456中的檔案的路徑名是,您可以運行:tools/sometool.sh
git show a123456:tools/sometool.sh
Git 會將存盤在該提交中的該檔案的內容轉儲到標準輸出。使用 shell (bash/sh/zsh/whatever) 重定向,您可以將此輸出保存到檔案中:
git show a123456:tools/sometool.sh > /tmp/sometool.sh
現在您可以從/tmp/sometool.sh.
(git cat-file -p變體是:
git cat-file -p a123456:tools/sometool.sh > /tmp/sometool.sh
一個git show更容易輸入。git cat-file在腳本中使用,因為它是一個“管道”命令;對于正常的人類命令,請使用git show.)
如果我不知道原始哈希 ID 怎么辦?
No problem! The branch name works just as well:
git show toolbranch:tools/sometool.sh > /tmp/sometool.sh
What if I need a whole bunch of files from toolbranch?
As long as your Git is at least version 2.5, and preferably at least 2.15, you can use git worktree add to add a whole separate working tree with that commit checked out:
git worktree add ../toolbranch
for instance. Now ../toolbranch contains the entire set of files extracted from the commit named via the branch name toolbranch.
Given that this gets every file out of the desired commit, it may be overkill for your situation. The git show or git cat-file -p variant is a much more refined tool (a lightsaber, or maybe bytesaber, instead of a blaster, in Star Wars terms), but sometimes just blasting your way through something is convenient.
(Use git worktree remove later to discard the added work-tree, or just leave it around if it isn't bothering you. The bug fixed in 2.15 has to do with leaving added working trees around for more than 14 days while doing work in them, so if you start doing work in the added working tree, and are going to let it take two or more weeks, make sure you have the fixed-up Git.)
uj5u.com熱心網友回復:
這是我提出的解決方案:
- 添加您的腳本以
.gitignore使其不提交。(如果您打算更改它,您可以通過 強制暫存git add --force)。 - 當您需要運行它時,只需通過 . 簽出該檔案即可
git check out <SCRIPT_BRANCH> <SCRIPT_FILE_NAME>。
通過步驟 1,簽出的檔案不會被視為要暫存的檔案。
uj5u.com熱心網友回復:
當你的工具被引入時,你可以找到提交(使用git logor git blame <FILE>)。然后,您可以使用git cherry-pick將此特定提交獲取到您的分支中。如果您不想將這些更改提交到您的分支,您可以使用以下-n標志:
git cherry-pick -n <COMMIT>
這會將您的工具帶到當前分支而無需提交任何內容。你可以執行腳本并做你想做的事。之后,您可以執行git reset(取消精選的內容)并洗掉您的檔案。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/449509.html
標籤:混帐
上一篇:如何創建具有相同提交歷史的本地新GitHub存盤庫?
下一篇:為什么當它涉及兩個檔案夾時,我的沒有沖突的合并提交會顯示在由一個檔案夾過濾的gitlog中,而不是另一個檔案夾?
