『壹』 45 個 Git 經典操作場景,專治不會合代碼-
git 對於大家應該都不太陌生,熟練使用git已經成為程序員的一項基本技能,盡管在工作中有諸如 Sourcetree 這樣牛X的客戶端工具,使得合並代碼變的很方便。但找工作面試和一些需彰顯個人實力的場景,仍然需要我們掌握足夠多的git命令。
下邊我們整理了45個日常用git合代碼的經典操作場景,基本覆蓋了工作中的需求。
如果你用 git commit -a 提交了一次變化(changes),而你又不確定到底這次提交了哪些內容。你就可以用下面的命令顯示當前 HEAD 上的最近一次的提交(commit):
或者
如果你的提交信息( commit message )寫錯了且這次提交(commit)還沒有推(push), 你可以通過下面的方法來修改提交信息( commit message ):
這會打開你的默認編輯器, 在這里你可以編輯信息. 另一方面, 你也可以用一條命令一次完成:
如果你已經推(push)了這次提交(commit), 你可以修改這次提交(commit)然後強推( force push ), 但是不推薦這么做。
如果這只是單個提交(commit),修改它:
如果你需要修改所有 歷史 , 參考 'git filter-branch'的指南頁.
通過下面的方法,從一個提交(commit)里移除一個文件:
這將非常有用,當你有一個開放的補丁( open patch ),你往上面提交了一個不必要的文件,你需要強推( force push )去更新這個遠程補丁。
如果你需要刪除推了的提交( pushed commits ),你可以使用下面的方法。可是,這會不可逆的改變你的 歷史 ,也會搞亂那些已經從該倉庫拉取(pulled)了的人的 歷史 。簡而言之,如果你不是很確定,千萬不要這么做。
如果你還沒有推到遠程, 把Git重置(reset)到你最後一次提交前的狀態就可以了(同時保存暫存的變化):
這只能在沒有推送之前有用. 如果你已經推了, 唯一安全能做的是 git revert SHAofBadCommit , 那會創建一個新的提交(commit)用於撤消前一個提交的所有變化(changes);或者, 如果你推的這個分支是rebase-safe的 (例如:其它開發者不會從這個分支拉), 只需要使用 git push -f 。
同樣的警告:不到萬不得已的時候不要這么做.
或者做一個 互動式rebase 刪除那些你想要刪除的提交(commit)里所對應的行。
注意, rebasing(見下面)和修正(amending)會用一個 新的提交(commit)代替舊的 , 所以如果之前你已經往遠程倉庫上推過一次修正前的提交(commit),那你現在就必須強推( force push ) ( -f )。注意 – 總是 確保你指明一個分支!
一般來說, 要避免強推 . 最好是創建和推(push)一個新的提交(commit),而不是強推一個修正後的提交。後者會使那些與該分支或該分支的子分支工作的開發者,在源 歷史 中產生沖突。
如果你意外的做了 git reset --hard , 你通常能找回你的提交(commit), 因為Git對每件事都會有日誌,且都會保存幾天。
你將會看到一個你過去提交(commit)的列表, 和一個重置的提交。選擇你想要回到的提交(commit)的SHA,再重置一次:
這樣就完成了。
一般來說, 如果你想暫存一個文件的一部分, 你可這樣做:
-p 簡寫。這會打開交互模式, 你將能夠用 s 選項來分隔提交(commit);然而, 如果這個文件是新的, 會沒有這個選擇, 添加一個新文件時, 這樣做:
然後, 你需要用 e 選項來手動選擇需要添加的行,執行 git diff --cached 將會顯示哪些行暫存了哪些行只是保存在本地了。
git add 會把整個文件加入到一個提交. git add -p 允許互動式的選擇你想要提交的部分.
多數情況下,你應該將所有的內容變為未暫存,然後再選擇你想要的內容進行commit。但假定你就是想要這么做,這里你可以創建一個臨時的commit來保存你已暫存的內容,然後暫存你的未暫存的內容並進行stash。然後reset最後一個commit將原本暫存的內容變為未暫存,最後stash pop回來。
注意1: 這里使用 pop 僅僅是因為想盡可能保持冪等。注意2: 假如你不加上 --index 你會把暫存的文件標記為為存儲。
如果你只是想重置源(origin)和你本地(local)之間的一些提交(commit),你可以:
重置某個特殊的文件, 你可以用文件名做為參數:
如果你想丟棄工作拷貝中的一部分內容,而不是全部。
簽出(checkout)不需要的內容,保留需要的。
另外一個方法是使用 stash , Stash所有要保留下的內容, 重置工作拷貝, 重新應用保留的部分。
或者, stash 你不需要的部分, 然後stash drop。
這是另外一種使用 git reflog 情況,找到在這次錯誤拉(pull) 之前HEAD的指向。
重置分支到你所需的提交(desired commit):
完成。
先確認你沒有推(push)你的內容到遠程。
git status 會顯示你領先(ahead)源(origin)多少個提交:
一種方法是:
在main下創建一個新分支,不切換到新分支,仍在main下:
把main分支重置到前一個提交:
HEAD^ 是 HEAD^1 的簡寫,你可以通過指定要設置的 HEAD 來進一步重置。
或者, 如果你不想使用 HEAD^ , 找到你想重置到的提交(commit)的hash( git log 能夠完成), 然後重置到這個hash。使用 git push 同步內容到遠程。
例如, main分支想重置到的提交的hash為 a13b85e :
簽出(checkout)剛才新建的分支繼續工作:
假設你正在做一個原型方案(原文為working spike (see note)), 有成百的內容,每個都工作得很好。現在, 你提交到了一個分支,保存工作內容:
當你想要把它放到一個分支里 (可能是 feature , 或者 develop ), 你關心是保持整個文件的完整,你想要一個大的提交分隔成比較小。
假設你有:
我去可以通過把內容拿到你的分支里,來解決這個問題:
這會把這個文件內容從分支 solution 拿到分支 develop 里來:
然後, 正常提交。
假設你有一個 main 分支, 執行 git log , 你看到你做過兩次提交:
讓我們用提交hash(commit hash)標記bug ( e3851e8 for #21, 5ea5173 for #14).
首先, 我們把 main 分支重置到正確的提交( a13b85e ):
現在, 我們對 bug #21 創建一個新的分支:
接著, 我們用 _cherry-pick_ 把對 bug #21 的提交放入當前分支。這意味著我們將應用(apply)這個提交(commit),僅僅這一個提交(commit),直接在HEAD上面。
這時候, 這里可能會產生沖突, 參見互動式 rebasing 章 沖突節 解決沖突.
再者, 我們為bug #14 創建一個新的分支, 也基於 main 分支
最後, 為 bug #14 執行 cherry-pick :
一旦你在github 上面合並(merge)了一個 pull request , 你就可以刪除你fork里被合並的分支。如果你不準備繼續在這個分支里工作, 刪除這個分支的本地拷貝會更干凈,使你不會陷入工作分支和一堆陳舊分支的混亂之中。
如果你定期推送到遠程, 多數情況下應該是安全的,但有些時候還是可能刪除了還沒有推到遠程的分支。讓我們先創建一個分支和一個新的文件:
添加文件並做一次提交
現在我們切回到主(main)分支,『不小心的』刪除 my-branch 分支
在這時候你應該想起了 reflog , 一個升級版的日誌,它存儲了倉庫(repo)裡面所有動作的 歷史 。
正如你所見,我們有一個來自刪除分支的提交hash(commit hash),接下來看看是否能恢復刪除了的分支。
看! 我們把刪除的文件找回來了。Git的 reflog 在rebasing出錯的時候也是同樣有用的。
刪除一個遠程分支:
你也可以:
刪除一個本地分支:
首先, 從遠程拉取(fetch) 所有分支:
假設你想要從遠程的 daves 分支簽出到本地的 daves
( --track 是 git checkout -b [branch] [remotename]/[branch] 的簡寫)
這樣就得到了一個 daves 分支的本地拷貝, 任何推過(pushed)的更新,遠程都能看到.
你可以合並(merge)或rebase了一個錯誤的分支, 或者完成不了一個進行中的rebase/merge。Git 在進行危險操作的時候會把原始的HEAD保存在一個叫ORIG_HEAD的變數里, 所以要把分支恢復到rebase/merge前的狀態是很容易的。
不幸的是,如果你想把這些變化(changes)反應到遠程分支上,你就必須得強推( force push )。是因你快進( Fast forward )了提交,改變了Git 歷史 , 遠程分支不會接受變化(changes),除非強推(force push)。
這就是許多人使用 merge 工作流, 而不是 rebasing 工作流的主要原因之一, 開發者的強推(force push)會使大的團隊陷入麻煩。使用時需要注意,一種安全使用 rebase 的方法是,不要把你的變化(changes)反映到遠程分支上, 而是按下面的做:
假設你的工作分支將會做對於 main 的pull-request。一般情況下你不關心提交(commit)的時間戳,只想組合 所有 提交(commit) 到一個單獨的裡面, 然後重置(reset)重提交(recommit)。確保主(main)分支是最新的和你的變化都已經提交了, 然後:
如果你想要更多的控制, 想要保留時間戳, 你需要做互動式rebase (interactive rebase):
如果沒有相對的其它分支, 你將不得不相對自己的 HEAD 進行 rebase。例如:你想組合最近的兩次提交(commit), 你將相對於 HEAD~2 進行rebase, 組合最近3次提交(commit), 相對於 HEAD~3 , 等等。
在你執行了互動式 rebase的命令(interactive rebase command)後, 你將在你的編輯器里看到類似下面的內容:
所有以 # 開頭的行都是注釋, 不會影響 rebase.
然後,你可以用任何上面命令列表的命令替換 pick , 你也可以通過刪除對應的行來刪除一個提交(commit)。
例如, 如果你想 單獨保留最舊(first)的提交(commit),組合所有剩下的到第二個裡面 , 你就應該編輯第二個提交(commit)後面的每個提交(commit) 前的單詞為 f :
如果你想組合這些提交(commit) 並重命名這個提交(commit) , 你應該在第二個提交(commit)旁邊添加一個 r ,或者更簡單的用 s 替代 f :
你可以在接下來彈出的文本提示框里重命名提交(commit)。
如果成功了, 你應該看到類似下面的內容:
--no-commit 執行合並(merge)但不自動提交, 給用戶在做提交前檢查和修改的機會。 no-ff 會為特性分支(feature branch)的存在過留下證據, 保持項目 歷史 一致。
有時候,在將數據推向上游之前,你有幾個正在進行的工作提交(commit)。這時候不希望把已經推(push)過的組合進來,因為其他人可能已經有提交(commit)引用它們了。
這會產生一次互動式的rebase(interactive rebase), 只會列出沒有推(push)的提交(commit), 在這個列表時進行reorder/fix/squash 都是安全的。
檢查一個分支上的所有提交(commit)是否都已經合並(merge)到了其它分支, 你應該在這些分支的head(或任何 commits)之間做一次diff:
這會告訴你在一個分支里有而另一個分支沒有的所有提交(commit), 和分支之間不共享的提交(commit)的列表。另一個做法可以是:
如果你看到的是這樣:
這意味著你rebase的分支和當前分支在同一個提交(commit)上, 或者 領先(ahead) 當前分支。你可以嘗試:
如果你不能成功的完成rebase, 你可能必須要解決沖突。
首先執行 git status 找出哪些文件有沖突:
在這個例子裡面, README.md 有沖突。打開這個文件找到類似下面的內容:
你需要解決新提交的代碼(示例里, 從中間 == 線到 new-commit 的地方)與 HEAD 之間不一樣的地方.
有時候這些合並非常復雜,你應該使用可視化的差異編輯器(visual diff editor):
在你解決完所有沖突和測試過後, git add 變化了的(changed)文件, 然後用 git rebase --continue 繼續rebase。
如果在解決完所有的沖突過後,得到了與提交前一樣的結果, 可以執行 git rebase --skip 。
任何時候你想結束整個rebase 過程,回來rebase前的分支狀態, 你可以做:
暫存你工作目錄下的所有改動
你可以使用 -u 來排除一些文件
假設你只想暫存某一個文件
假設你想暫存多個文件
這樣你可以在 list 時看到它
或
首先你可以查看你的 stash 記錄
然後你可以 apply 某個 stash
此處, 'n'是 stash 在棧中的位置,最上層的 stash 會是0
除此之外,也可以使用時間標記(假如你能記得的話)。
你需要手動create一個 stash commit , 然後使用 git stash store 。
如果已經克隆了:
如果你想恢復一個已刪除標簽(tag), 可以按照下面的步驟: 首先, 需要找到無法訪問的標簽(unreachable tag):
記下這個標簽(tag)的hash,然後用Git的 update-ref
這時你的標簽(tag)應該已經恢復了。
如果某人在 GitHub 上給你發了一個 pull request , 但是然後他刪除了他自己的原始 fork, 你將沒法克隆他們的提交(commit)或使用 git am 。在這種情況下, 最好手動的查看他們的提交(commit),並把它們拷貝到一個本地新分支,然後做提交。
做完提交後, 再修改作者,參見變更作者。然後, 應用變化, 再發起一個新的 pull request 。
在 OS X 和 Linux 下, 你的 Git的配置文件儲存在 ~/.gitconfig 。我在 [alias] 部分添加了一些快捷別名(和一些我容易拼寫錯誤的),如下:
你可能有一個倉庫需要授權,這時你可以緩存用戶名和密碼,而不用每次推/拉(push/pull)的時候都輸入,Credential helper能幫你。
你把事情搞砸了:你 重置(reset) 了一些東西, 或者你合並了錯誤的分支, 亦或你強推了後找不到你自己的提交(commit)了。有些時候, 你一直都做得很好, 但你想回到以前的某個狀態。
這就是 git reflog 的目的, reflog 記錄對分支頂端(the tip of a branch)的任何改變, 即使那個頂端沒有被任何分支或標簽引用。基本上, 每次HEAD的改變, 一條新的記錄就會增加到 reflog 。遺憾的是,這只對本地分支起作用,且它只跟蹤動作 (例如,不會跟蹤一個沒有被記錄的文件的任何改變)。
上面的reflog展示了從main分支簽出(checkout)到2.2 分支,然後再簽回。那裡,還有一個硬重置(hard reset)到一個較舊的提交。最新的動作出現在最上面以 HEAD@{0} 標識.
如果事實證明你不小心回移(move back)了提交(commit), reflog 會包含你不小心回移前main上指向的提交(0254ea7)。
然後使用 git reset 就可以把main改回到之前的commit,這提供了一個在 歷史 被意外更改情況下的安全網。
『貳』 求《程序員健康指南》全文免費下載百度網盤資源,謝謝~
《程序員健康指南》網路網盤pdf最新全集下載:
鏈接: https://pan..com/s/1Y7zFA_9M0YwA1miaZTWR-w
『叄』 小白,想入門程序員,應該從什麼開始學,順序是什麼
小白想要成為程序員,首選是選擇一門合適的語言,比如說:Python、Java、C、C++、GO語言等;其次,選擇合適的學習方式,比如培訓,周末班、脫產班還是網路班。
如果完全沒有編程基礎,建議大家學習Python,Python入門簡單、語法清晰、通俗易懂,非常適合零基礎人員。
『肆』 程序員必讀的14本書籍
程序員必讀書籍有哪些呢?下面是我精心為您整理的程序員必讀的14本書籍,希望您喜歡!
程序員必讀的14本書籍
1、《代碼大全》 史蒂夫·邁克康奈爾
“優秀的編程實踐的網路全書,《代碼大全》注重個人技術,其中所有東西加起來, 就是我們本能所說的“編寫整潔的代碼”。這本書有50頁在談論代碼布局。” —— Joel Spolsky
Steve McConnell的原作《代碼大全》(第1版)是公認的關於編程的最佳實踐指南之一, 在過去的十多年間,本書一直在幫助開發人員編寫更好的軟體。
無論您的經驗水平如何,也不管您在怎樣的開發環境中工作,也無論項目是大是小, 本書都將激發您的思維並幫助您構建高品質的代碼。
2、《計算機程序的構造和解釋》
《代碼大全》、《重構》和《設計模式》這些經典書會教給你高效的工作習慣和交易細節。 其他像《人件集》、《計算機編程心理學》和《人月神話》這些書會深入軟體開發的心理層面。 其他書籍則處理演算法。這些書都有自己所屬的位置。
然而《計算機程序的構造和解釋》與這些不同。 這是一本會啟發你的書,它會燃起你編寫出色程序的熱情; 它還將教會你認識並欣賞美; 它會讓你有種敬畏,讓你難以抑制地渴望學習更多的東西。
其他書或許會讓你成為一位更出色的程序員,但此書將一定會讓你成為一名程序員。
3、《C程序設計語言》
《C程序設計語言》(第2版新版)原著即為C語言的設計者之一Dennis M.Ritchie和著名的計算機科學家Brian W.Kernighan合著的 一本介紹C語言的權威經典著作。 我們現在見到的大量論述C語言程序設計的教材和專著均以此書為藍本。
原著第1版中介紹的C語言成為後來廣泛使用的C語言版本——標准C的基礎。
人們熟知的“hello,world”程序就是由本書首次引入的,現在,這一程序已經成為所有程序設計語言入門的第一課。
4、程序員思維修煉(修訂版)
生命中沒有什麼是一成不變的,人們需要改變自己的習慣和方法。不論你是程序員、軟體公司管理者、技術奇人還是思想家,或者你只是想讓自己的大腦更聰明一點兒,所有嘗試改變自己的人,請把本書當作改變的開始……
5、系統化思維導論
關注人文,掌握思維法則,揭開科學與技術的神秘面紗
“它給我的震撼是第一次我能從全局的角度去看待各個學科,科學也不再是冷冰冰的割裂了的教條,不再是難以理解的一堆符號。”
6、優秀的叛逆者:引領組織變革的力量
Lois Kelly和Carmen Medina用她們的實戰經驗,向我們展示了如何在工作中贏得信賴、提出想法、處理人際關系、管理沖突和保持理智。”
——亞當•格蘭特,沃頓商學院教授,《紐約時報》暢銷書Give and Take的作者
7、《重構:改善既有代碼的設計》
《重構:改善既有代碼的設計》適合軟體開發人員、項目管理人員等閱讀, 也可作為高等院校計算機及相關專業師生的參考讀物。
8、《Site Reliability Engineering》
《SRE:Google運維解密》可以讓讀者學習到Google工程師在提高系統部署規模、改進可靠性和資源利用效率方面的指導思想與具體實踐——這些都是可以立即直接應用的寶貴經驗。任何一個想要創建、擴展大規模集成系統的人都應該閱讀,該書針對如何構建一個可長期維護的系統提供了非常寶貴的實踐經驗。
9、《Refactoring》
那時候當我讀這本《重構:改善既有代碼的設計》時,由於它在關於代碼異味的單獨章節所花的篇幅,使得這本書非常值這個價。該書非常成功,因為它使重構和代碼異味的觀念成為主流。
Steve Yegge曾對這本書不吝贊譽之詞:
2003年10月,我第一次閱讀這本書,有一種不寒而粟的感覺。如果你意識到,當你想離職時,你已經工作5年。轉天我就隨意問周圍:“嗯,你已經讀過重構方面的書,對吧?我只是隨便問問,因為我很久以前讀過,當然不是現在。”在我所調查的20個人中,只有一個人
10、《Peopleware》
在大學時我讀到這本《人件》,該書似乎很令人信服,甚至所有的研究結果都支持該書的觀點:不設置截止日期就比設置截止日期要好;辦公室比隔間要好,等等。所有開發人員跟我討論的時候,基本都贊同這些觀點。
11、《編程珠璣》
盡管我不得不羞愧地承認,書中一半的東西我都沒有理解,但我真的推薦《編程珠璣》,書中有些令人驚奇的東西。 – Matt Warren
12、《修改代碼的藝術》by Michael Feathers
我認為沒有任何一本書能向這本書一樣影響了我的編程觀點。它明確地告訴你如何處理其他人的代碼,含蓄地教會你避免哪些(以及為什麼要避免)。
同意。很多開發人員討論用干凈的石板來編寫軟體。但我想幾乎所有開發人員的某些時候是在吃其他開發人員的狗食。– Bernard Dy
13、《編碼:隱匿在計算機軟硬體背後的語言》
我推薦CharlesPetzold的《編碼》。在這個充滿工具和IDE的年代,很多復雜度已經從程序員那“抽取”走了,這本書一本開眼之作。 –hemil
14、《程序員健康指南》
『伍』 作為程序員計算機基礎的書推薦幾本唄
生活不僅僅只有寫代碼,作為程序員,我們不僅要將數據結構、計昌敬讓算機網路、操作系統這三把斧玩好,更要擁有一個強健的體魄!
網路:
萬物互稿山聯時代,如果你還不懂網路知識,那將寸步難行。這里推薦三本經典書籍:
TCP/IP詳解
該書是網路專家、著名技術作家W.RichardStevens的傳世之作,內容詳盡且極具權威,被譽為TCP/IP領域的不朽名著,就我認識的老通信行業的專業開發人員,基本人手一本。本書共三卷,其中卷一偏重於基礎原理,卷二、卷三更多偏重於編程細節,作為基礎書籍推薦,卷一即可,對於學有餘力的童鞋,可學習二、三卷。
圖解HTTP
應用最廣泛的協議之一,前端工程師分析抓包分析數據,後端工程師實現RESTAPI、搭建自己的HTTP伺服器等過程中都繞不開HTTP這一知識點,《圖解HTTP》,用通俗易懂的語言講解了HTTP協議的方方面面,本書列舉諸多常見通信場景及實戰案例,最後延伸到Web安全、最新技術動向等方面,實在是一本不可多得的好書。
Wireshark網路分析就這么簡單
「授人以魚不如授人以漁」,全書以詼諧幽默的寫法為我們講解了枯燥的技術問題,由淺入深的用Wireshark分析了常見的網路協議,還通過身邊的真實案例分享了Wireshark使用技巧,對初學者是很好的啟蒙書籍。本書可搭配前面介紹的兩本基礎理論書籍一起學習,必能達到事半功倍的效果。
操作系統:
現代操作系統
程序員的耐局自我修養——鏈接、裝載和庫
如果你是高手,LinuxHacker或者geek,請繞行
但如果你是新手
如果你曾好奇過windows系統目錄下和軟體目錄下大堆大堆的dll文件是什麼?
如果你曾疑惑過我寫下的代碼經歷的怎樣的歷程最後怎樣到達了內存?
編譯器每天用,它到底做了什麼?
如果你已經學習或接觸了C,匯編,計算機結構,但還是沒辦法把三者的關系理順。
那麼,《程序員的自我修養——鏈接、裝載和庫》這本書絕對是對你的有幫助。
數據結構
基礎入門的話,這里推薦《大話數據結構》。本書以一名教師的教學為場景,用生動形象的語言講解數據結構和相關演算法的知識。全文大量引用了各種各樣的生活知識來類比數據結構中的專業知識。
程序員必備書籍
重要!
重要!
重要!
作為本文的壓軸戲,也是最重要的一本書《程序員健康指南》推薦給各位程序猿友們,專門為程序員量身製作的健康指南,針對頭痛、眼部疲勞、背部疼痛和手腕疼痛等常見的問題介紹了其成因和對策。身體是革命的本錢,各位在長期面對996的同時,一定要注意身體,加強鍛煉,提高免疫力!