給自己看的GIT指南
給前看后忘不用就忘的自己寫的指南。不求完備,但求清晰實用。
基礎(chǔ)操作
git init [project-name]
-
git diff
顯示add以前的不同點 -
git diff --staged
顯示add以后文件和上一版的區(qū)別 git status
-
git add [file]
ORgit add -A
ORgit add .
-
git reset [file]
ORgit rm --cached [file]
git add的逆操作,unstage git commit -m "[descriptive message]"
-
git log
ORgit log --oneline
-
git checkout [SHA]
我就看看你當(dāng)初的樣子,不能改動。 -
git checkout master
回到現(xiàn)實 -
git revert [SHA] => ;wq
單獨(dú)把某次commit效果去除掉(git log里多了一個commit,用來抵消你那次commit) -
git reset [SHA]
把某次commit之后的遞交都退回到stage階段。文件內(nèi)容不會變動。 -
git reset [SHA] --hard
文件內(nèi)容也刪除了。No way back!
Q&A:
Q:add、commit?為什么要分成2步?
A:commit相當(dāng)于給現(xiàn)在的代碼拍快照(也有說是游戲里的安全存檔),add就是拍快照前的準(zhǔn)備工作,類似于快門的兩段式設(shè)計中的第一步。這樣你也不需要頻繁commit。另外你可以用add分批次commit,以后rollback的時候顆粒度更小。
tips
- 每次小功能跑通了就得commit。不要囤著。(否則要你roll back一個地方,其他的不變,你就傻眼了)
- commit要把每次的小功能寫清楚,以后才不會看不懂
處理分支
Git一開始只有一條master主線。有一天,一起協(xié)作的小伙伴小寶想要單獨(dú)測試自己的新代碼。為了不破壞主線代碼,他“復(fù)制”了一份主線,給自己獨(dú)立分支,隨便折騰,也不會影響主線。這就是branch,開分支。
master branch應(yīng)該保持持續(xù)可用,對外公開。所以新的功能應(yīng)該在分支里跑通了再merge。
新建分支:
git branch feature-1
轉(zhuǎn)到新分支上:
git checkout feature-a
??合并為一步:
git checkout -b feature-a
查詢分支:
git branch -a
刪除分支:
git branch master => git branch -D feature-a
合并分支:(先回到master才能合并)
git branch master => git merge feature-a
合并有沖突時,git把變化都放在master里,你自己改好以后再add/commit=>:wq
遠(yuǎn)程倉庫那些事
本地repo上傳到GitHub新倉庫
- 先在GitHub上新建一個repo,名字和本地文件夾相同。不用加README。復(fù)制repo鏈接。
- 回到本地terminal,add/commit所有變動,用status確認(rèn)nothing to commit
git push [url] master
- 之后變得commit以后,使用
git push [url] master
。如果每次輸入url很麻煩,可以如下操作:- 先新建一個alias
git remote add origin [url]
- 以后就可以使用
git push origin master
- 先新建一個alias
GitHub新建repo以后clone到本地
- 先在GitHub上新建一個repo。這次可以加README。
- 復(fù)制鏈接
- 回到本地terminal
git clone [url]
-
git remote -v
查詢遠(yuǎn)程alias名稱 - 變動后提交:
git push origin master
使用遠(yuǎn)端和其他人合作開發(fā)的workflow (NetNinja推薦的,并且每個人都有編輯權(quán)限)
- 先回到本地master
git pull origin master
- 假設(shè)你在這個基礎(chǔ)上開發(fā)新特性
git checkout -b feature-c
- add/commit以后,不要直接合并本地master,先上傳到remote的feature-c分支,讓其他人確認(rèn)過,在remote端merge,然后再pull回本地repo。
- 所以這時候先
git push origin feature-c
- 然后登錄GitHub倉庫,點擊compare & pull request。
- 處理conflict以后merge,同時點擊刪除branch。Done!
- 回到local,先pull最新的更新。
git checkout master
git pull origin master
git checkout -b feature-d
- 循環(huán)
- 總結(jié):在本地,永遠(yuǎn)在新的branch上工作,push到遠(yuǎn)端的分支,在遠(yuǎn)端merge,在pull回本地。
使用fork為open source project做貢獻(xiàn)的workflow(你沒有直接編輯權(quán)限)
- 點擊fork
- 你自己賬戶下會生成一份相同的repo
- clone到本地:復(fù)制鏈接,回到本地
git clone [url]
- 編輯,直接在master分支上add/commit后,推送到自己賬戶下的repo master分支
git push origin master
- 到GitHub的repo里點擊new pull request
問答
Q:Orphan分支又是什么?為什么要設(shè)計這個類型?方法是什么?
A:
Git - git-checkout Documentation
如何建立一個沒有 Parent 的獨(dú)立 Git branch | ihower { blogging }
Q:如何給他人分享編輯權(quán)限?
A:
其他思考
git ingore用什么用?
其他組織使用什么workflow?和Net Ninja的比較呢?
參考
Git & GitHub Tutorial for Beginners - YouTube Net Ninja Tutorial
Generating a new SSH key and adding it to the ssh-agent - User Documentation SSH創(chuàng)建
github-git-cheat-sheet Git Cheat Sheet
Log
- 2019年初:第一稿。用時2小時。
- 2019年1月30日:全忘了。重讀,重寫。看完了NetNinja的教程。發(fā)現(xiàn)第一次寫的理解有誤。用時3小時。