Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537
分支的新建與合并
現(xiàn)在讓我們來看一個簡單的分支與合并的例子,實際工作中大體也會用到這樣的工作流程:
開發(fā)某個網(wǎng)站。 為實現(xiàn)某個新的需求,創(chuàng)建一個分支。 在這個分支上開展工作。
假設此時,你突然接到一個電話說有個很嚴重的問題需要緊急修補,那么可以按照下面的方式處理:
返回到原先已經(jīng)發(fā)布到生產服務器上的分支。 為這次緊急修補建立一個新分支,并在其中修復問題。 通過測試后,回到生產服務器所在的分支,將修補分支合并進來,然后再推送到生產服務器上。 切換到之前實現(xiàn)新需求的分支,繼續(xù)工作。
分支的新建與切換
首先,我們假設你正在項目中愉快地工作,并且已經(jīng)提交了幾次更新(見圖 3-10)。
圖 3-10. 一個簡短的提交歷史
現(xiàn)在,你決定要修補問題追蹤系統(tǒng)上的 #53 問題。順帶說明下,Git 并不同任何特定的問題追蹤系統(tǒng)打交道。這里為了說明要解決的問題,才把新建的分支取名為 iss53。要新建并切換到該分支,運行 git checkout 并加上 -b 參數(shù):
$ git checkout -b iss53 Switched to a new branch 'iss53'
這相當于執(zhí)行下面這兩條命令:
$ git branch iss53 $ git checkout iss53
圖 3-11 示意該命令的執(zhí)行結果。
圖 3-11. 創(chuàng)建了一個新分支的指針
接著你開始嘗試修復問題,在提交了若干次更新后,iss53 分支的指針也會隨著向前推進,因為它就是當前分支(換句話說,當前的 HEAD 指針正指向 iss53,見圖 3-12):
$ vim index.html $ git commit -a -m 'added a new footer [issue 53]'
圖 3-12. iss53 分支隨工作進展向前推進
現(xiàn)在你就接到了那個網(wǎng)站問題的緊急電話,需要馬上修補。有了 Git ,我們就不需要同時發(fā)布這個補丁和 iss53 里作出的修改,也不需要在創(chuàng)建和發(fā)布該補丁到服務器之前花費大力氣來復原這些修改。唯一需要的僅僅是切換回 master 分支。
不過在此之前,留心你的暫存區(qū)或者工作目錄里,那些還沒有提交的修改,它會和你即將檢出的分支產生沖突從而阻止 Git 為你切換分支。切換分支的時候最好保持一個清潔的工作區(qū)域。稍后會介紹幾個繞過這種問題的辦法(分別叫做 stashing 和 commit amending)。目前已經(jīng)提交了所有的修改,所以接下來可以正常轉換到 master 分支:
$ git checkout master Switched to branch 'master'
此時工作目錄中的內容和你在解決問題 #53 之前一模一樣,你可以集中精力進行緊急修補。這一點值得牢記:Git 會把工作目錄的內容恢復為檢出某分支時它所指向的那個提交對象的快照。它會自動添加、刪除和修改文件以確保目錄的內容和你當時提交時完全一樣。
接下來,你得進行緊急修補。我們創(chuàng)建一個緊急修補分支 hotfix 來開展工作,直到搞定(見圖 3-13):
$ git checkout -b hotfix Switched to a new branch 'hotfix' $ vim index.html $ git commit -a -m 'fixed the broken email address' [hotfix 3a0874c] fixed the broken email address 1 files changed, 1 deletion(-)
圖 3-13. hotfix 分支是從 master 分支所在點分化出來的
有必要作些測試,確保修補是成功的,然后回到 master 分支并把它合并進來,然后發(fā)布到生產服務器。用 git merge 命令來進行合并:
$ git checkout master $ git merge hotfix Updating f42c576..3a0874c Fast-forward README | 1 - 1 file changed, 1 deletion(-)
請注意,合并時出現(xiàn)了“Fast forward”的提示。由于當前 master 分支所在的提交對象是要并入的 hotfix 分支的直接上游,Git 只需把 master 分支指針直接右移。換句話說,如果順著一個分支走下去可以到達另一個分支的話,那么 Git 在合并兩者時,只會簡單地把指針右移,因為這種單線的歷史分支不存在任何需要解決的分歧,所以這種合并過程可以稱為快進(Fast forward)。
現(xiàn)在最新的修改已經(jīng)在當前 master 分支所指向的提交對象中了,可以部署到生產服務器上去了(見圖 3-14)。
圖 3-14. 合并之后,master 分支和 hotfix 分支指向同一位置。
在那個超級重要的修補發(fā)布以后,你想要回到被打擾之前的工作。由于當前 hotfix 分支和 master 都指向相同的提交對象,所以 hotfix 已經(jīng)完成了歷史使命,可以刪掉了。使用 git branch 的 -d 選項執(zhí)行刪除操作:
$ git branch -d hotfix Deleted branch hotfix (was 3a0874c).
現(xiàn)在回到之前未完成的 #53 問題修復分支上繼續(xù)工作(圖 3-15):
$ git checkout iss53 Switched to branch 'iss53' $ vim index.html $ git commit -a -m 'finished the new footer [issue 53]' [iss53 ad82d7a] finished the new footer [issue 53] 1 file changed, 1 insertion(+)
圖 3-15. iss53 分支可以不受影響繼續(xù)推進。
值得注意的是之前 hotfix 分支的修改內容尚未包含到 iss53 中來。如果需要納入此次修補,可以用 git merge master 把 master 分支合并到 iss53;或者等 iss53 完成之后,再將 iss53 分支中的更新并入 master。
分支的合并
在問題 #53 相關的工作完成之后,可以合并回 master 分支。實際操作同前面合并 hotfix 分支差不多,只需回到 master 分支,運行 git merge 命令指定要合并進來的分支:
$ git checkout master $ git merge iss53 Auto-merging README Merge made by the 'recursive' strategy. README | 1 + 1 file changed, 1 insertion(+)
請注意,這次合并操作的底層實現(xiàn),并不同于之前 hotfix 的并入方式。因為這次你的開發(fā)歷史是從更早的地方開始分叉的。由于當前 master 分支所指向的提交對象(C4)并不是 iss53 分支的直接祖先,Git 不得不進行一些額外處理。就此例而言,Git 會用兩個分支的末端(C4 和 C5)以及它們的共同祖先(C2)進行一次簡單的三方合并計算。圖 3-16 用紅框標出了 Git 用于合并的三個提交對象:
圖 3-16. Git 為分支合并自動識別出最佳的同源合并點。
這次,Git 沒有簡單地把分支指針右移,而是對三方合并后的結果重新做一個新的快照,并自動創(chuàng)建一個指向它的提交對象(C6)(見圖 3-17)。這個提交對象比較特殊,它有兩個祖先(C4 和 C5)。
值得一提的是 Git 可以自己裁決哪個共同祖先才是最佳合并基礎;這和 CVS 或 Subversion(1.5 以后的版本)不同,它們需要開發(fā)者手工指定合并基礎。所以此特性讓 Git 的合并操作比其他系統(tǒng)都要簡單不少。
圖 3-17. Git 自動創(chuàng)建了一個包含了合并結果的提交對象。
既然之前的工作成果已經(jīng)合并到 master 了,那么 iss53 也就沒用了。你可以就此刪除它,并在問題追蹤系統(tǒng)里關閉該問題。
$ git branch -d iss53
遇到?jīng)_突時的分支合并
有時候合并操作并不會如此順利。如果在不同的分支中都修改了同一個文件的同一部分,Git 就無法干凈地把兩者合到一起(譯注:邏輯上說,這種問題只能由人來裁決。)。如果你在解決問題 #53 的過程中修改了 hotfix 中修改的部分,將得到類似下面的結果:
$ git merge iss53 Auto-merging index.html CONFLICT (content): Merge conflict in index.html Automatic merge failed; fix conflicts and then commit the result.
Git 作了合并,但沒有提交,它會停下來等你解決沖突。要看看哪些文件在合并時發(fā)生沖突,可以用 git status 查閱:
$ git status On branch master You have unmerged paths. (fix conflicts and run "git commit") Unmerged paths: (use "git add ..." to mark resolution) both modified: index.html no changes added to commit (use "git add" and/or "git commit -a")
任何包含未解決沖突的文件都會以未合并(unmerged)的狀態(tài)列出。Git 會在有沖突的文件里加入標準的沖突解決標記,可以通過它們來手工定位并解決這些沖突??梢钥吹酱宋募愃葡旅孢@樣的部分:
<<<<<<< HEAD
contact : email.support@github.com
=======
please contact us at support@github.com
>>>>>>> iss53
可以看到=======隔開的上半部分,是 HEAD(即 master 分支,在運行 merge 命令時所切換到的分支)中的內容,下半部分是在 iss53 分支中的內容。解決沖突的辦法無非是二者選其一或者由你親自整合到一起。比如你可以通過把這段內容替換為下面這樣來解決:
please contact us at email.support@github.com
這個解決方案各采納了兩個分支中的一部分內容,而且我還刪除了 <<<<<<<,=======和 >>>>>>> 這些行。在解決了所有文件里的所有沖突后,運行 git add 將把它們標記為已解決狀態(tài)(譯注:實際上就是來一次快照保存到暫存區(qū)域。)。因為一旦暫存,就表示沖突已經(jīng)解決。如果你想用一個有圖形界面的工具來解決這些問題,不妨運行 git mergetool,它會調用一個可視化的合并工具并引導你解決所有沖突:
$ git mergetool This message is displayed because 'merge.tool' is not configured. See 'git mergetool --tool-help' or 'git help config' for more details. 'git mergetool' will now attempt to use one of the following tools: opendiff kdiff3 tkdiff xxdiff meld tortoisemerge gvimdiff diffuse diffmerge ecmerge p4merge araxis bc3 codecompare vimdiff emerge Merging: index.html Normal merge conflict for 'index.html': {local}: modified file {remote}: modified file Hit return to start merge resolution tool (opendiff):
如果不想用默認的合并工具(Git 為我默認選擇了 opendiff,因為我在 Mac 上運行了該命令),你可以在上方"merge tool candidates"里找到可用的合并工具列表,輸入你想用的工具名。我們將在第七章討論怎樣改變環(huán)境中的默認值。
退出合并工具以后,Git 會詢問你合并是否成功。如果回答是,它會為你把相關文件暫存起來,以表明狀態(tài)為已解決。
再運行一次 git status 來確認所有沖突都已解決:
$ git status On branch master Changes to be committed: (use "git reset HEAD ..." to unstage) modified: index.html
如果覺得滿意了,并且確認所有沖突都已解決,也就是進入了暫存區(qū),就可以用 git commit 來完成這次合并提交。提交的記錄差不多是這樣:
Merge branch 'iss53' Conflicts: index.html # # It looks like you may be committing a merge. # If this is not correct, please remove the file # .git/MERGE_HEAD # and try again. #
如果想給將來看這次合并的人一些方便,可以修改該信息,提供更多合并細節(jié)。比如你都作了哪些改動,以及這么做的原因。有時候裁決沖突的理由并不直接或明顯,有必要略加注解。
otepad++ 十幾年前就作妖,沒想到今天又見到其作妖,果斷 -- 換!
在Windows11 下,將前面的輕量民用編輯器,全部打開,靜置5分鐘后,內存顯示如下:
剛打開,如下:
靜置5分鐘后,如下:
以上測試,只當一樂。
注:本章偏重專業(yè)輕量級編輯器,即,從事開發(fā)、運維人員使用可能更好一些。
一、RJ TextEd
RJ TextEd 是一個功能齊全的文本和源代碼編輯器,支持 Unicode。它也是一個非常強大的網(wǎng)絡(PHP、ASP、JavaScript、HTML 和 CSS)開發(fā)編輯器。該功能不僅限于文本文件,還包括通過集成的 CSS/HTML 預覽、拼寫檢查、自動完成、HTML 驗證、模板等支持 CSS/HTML 編輯。該程序還有一個雙窗格文件指揮官,以及一個 (S)FTP 客戶端來上傳您的文件。以下是可用功能的一小部分列表。如需完整列表,請查看功能部分。
優(yōu)點:功能齊全,免費、免費、免費
缺點:體感不是很流暢,比如最大化,最小化時,可能是效果
查找 “RJ TextEd” - 鳳悠悠
二、TextPad
TextPad 已根據(jù) Windows 用戶界面指南實施,因此非常注重讓初學者和有經(jīng)驗的用戶都能輕松使用它。所有命令都可以使用上下文幫助,并且可以使用鼠標右鍵彈出上下文菜單。Windows 多文檔界面允許同時編輯多個文件,每個文件最多有 2 個視圖。文本可以在文件之間拖放。
優(yōu)點:精,快,跟EmEditor一個階層,占用小,速度快
缺點:收費
查找 “TextPad” - 鳳悠悠
三、GVim
GVim 是Windows版的VIM,Vim 是一個高度可配置的文本編輯器,旨在實現(xiàn)高效的文本編輯。它是隨大多數(shù) UNIX 系統(tǒng)分發(fā)的 vi 編輯器的改進版本。
Vim 通常被稱為“程序員的編輯器”,對編程非常有用,以至于許多人認為它是一個完整的IDE。不過,這不僅適用于程序員。Vim 非常適合各種文本編輯,從撰寫電子郵件到編輯配置文件。
盡管上述漫畫暗示了什么,Vim 可以配置為以一種非常簡單(類似記事本)的方式工作,稱為 evim 或 Easy Vim。
優(yōu)點:功能齊全,免費、免費、免費
缺點:需要單獨學習,一般人玩不轉(比如偶)
查找 “GVim” - 鳳悠悠
四、Emacs 編輯器
Emacs 是先進的、可擴展的、可定制的、自文檔化的編輯器。在Linux圈號稱最強編輯器,沒有之一。它的核心是 Emacs Lisp 的解釋器,這是一種 Lisp 編程語言的方言,具有支持文本編輯的擴展。
優(yōu)點:功能齊全,免費、免費、免費
缺點:需要單獨學習,一般人玩不轉(比如偶)
查找 “Emacs” - 鳳悠悠
ream 附加包通過把一個更加熟悉的“面孔”置于 Vim 文本編輯器之上,同時保留 Vim 的功能,使其更加容易使用。
當我把 Cream 介紹給他們以后,他們的失望就變成了滿意。Cream 是 Vim 的一個附加包,它使得 Vim 更加容易使用。Cream 讓這些 Linux 新手變成了 Vim 的堅決擁護者和忠心用戶。
讓我們來看一看 Cream 是什么以及它是如何讓 Vim 變得更加容易使用的。
Cream 的安裝
在安裝 Cream 之前,你需要先在你的電腦上安裝好 Vim 和 GVim 的 GUI 組件。我發(fā)現(xiàn)最容易完成這件事的方法是使用 Linux 版本的包管理器。
安裝好 Vim 以后,便可下載 Cream 的安裝程序,或者你也可以再次使用 Linux 發(fā)行版的包管理器進行安裝。
安裝好 Cream 以后,你可以從應用菜單選擇它(比如,Applications->Cream)或者在程序啟動器中輸入Cream,從而啟動 Cream 。
Cream 的使用
如果你之前已經(jīng)使用過 Gvim,那么你會注意到, Cream 幾乎沒改變該編輯器的外觀和感覺。最大的不同是 Cream 的菜單欄和工具欄,它們取代了 Gvim 陳舊的菜單欄和工具欄,新的菜單欄和工具欄的外觀和功能分組看起來和其它編輯器的一樣。
Cream 的菜單欄對用戶隱藏了更多的技術選項,比如指定一個編譯器的能力,以及運行make命令的能力。當你通過使用 Cream 更加熟悉 Vim 以后,你只需要從Setting->Preferences->Behavior選擇選項,就可以更容易地訪問這些特性。有了這些選項,你可以(如果你想)體驗到一個兼有 Cream 和傳統(tǒng) Vim 二者優(yōu)點的強大編輯器。
Cream 并不是僅由菜單驅動。盡管編輯器的功能僅有單擊或雙擊兩種方式,但是你也可以使用常見的鍵盤快捷鍵來執(zhí)行操作,比如 CTRL-O(打開一個文件),CTRL-C(復制文本)。你不需要在幾種模式之間切換,也不需要記住一些很難記住的命令。
Cream 開始運行以后,打開一個文件,或者新建一個文件,然后就可以開始輸入了。幾個我向他們介紹過 Cream 的人說,雖然 Cream 保留了 Vim 的許多典型風格,但是 Cream 使用起來更加舒服。
并不是說 Cream 是 Vim 的簡化版,遠遠不是。事實上, Cream 保留了 Vim 的全部特性,同時,它還有一系列其他有用的特性。我發(fā)現(xiàn)的 Cream 的一些有用的特性包括:
一個標簽式界面
語法高亮(特別是針對 Markdown、LaTeX 和 HTML)
自動修正拼寫錯誤
字數(shù)統(tǒng)計
內建文件瀏覽器
Cream 本身也有許多附加包,可以給編輯器增加一些新的特性。這些特性包括文本加密、清理電子郵件內容,甚至還有一個使用教程。老實說,我還沒有發(fā)現(xiàn)哪一個附加包是真正有用的,不過你的感受可能會有所不同。
原文來自:https://www.linuxprobe.com/cream-vim.html
*請認真填寫需求信息,我們會在24小時內與您取得聯(lián)系。