剛畢業的時候用過極短期的SVN,後面就一直在用Git來作代碼的版本控制了,前先後後差很少4年的時間,期間作了一些在使用Git過程當中的記錄和心得,在這裏分享給你們,你們或許能夠從中吸取到一些有用的東西。css
不管是github,仍是gitlab,仍是其餘的代碼託管平臺,代碼管理都是用git去作的,git能夠說是一名程序員的必備技能,對於工做和麪試都是很是有幫助的。html
git clone -b 分支名稱 遠程地址
git config user.name
git config user.email
git branch(查看當前分支)
git branch -a(查看全部分支)
git checkout 分支名(切換到對應分支)
會自動將代碼更新爲分支代碼git branch 分支名
(建立一個分支)git branch -d 分支名
(刪除一個分支)git branch -D 分支名
(強制刪除一個未合併的分支)git checkout -b 分支名 [基於的分支名或commit值]
(切換分支並直接切換過去)history
history | grep push
git log
git log --summary
git config --global user.name "Frankkai"
git config --global user.email "gaokai20100801@gmail.com"
git config user.name "Frankkai"
git config user.email "gaokai20100801@gmail.com"
git config --global --list
git config --local --list
git config --local user.name
git reset HEAD static/lib/js/constantsUrl.js
git checkout -- static/lib/js/constantsUrl.js
git diff
git diff HEAD
git diff --staged
git add "*.html"
git commit --amend
git add "*.js"
git reset octofamily/octodog.txt
git rm "*.txt"
git merge 分支名
git checkout -- <filename>
git stash
git stash pop
git stash pop stash@{0}
git push origin --delete branchname
git log
//找到commit hash值git reset --hard hash值
git stash list
git stash drop stash@{0}
git remote set-url origin git@foo.bar.com:baz/helloworld.git
git push --set-upstream origin preproduction
git push origin <tag_name>
git push --tags
git tag --list
git rm --cached -r .idea
// --cached僅僅刪除index,-r(recursive)遞歸刪除.idea目錄下的全部文件git add <file(s)>/.
git reset HEAD <file(s)>/.
git reset HEAD <file(s)>/. && git checkout -- <file(s)>/.
git add -u
git reset --hard
git diff HEAD [commit hash fragment]
git branch -D [branch name]
同步到remote後,合併多個commit 爲1個前端
git rebase -i HEAD~2/hash pick && squash :wq!
git remote -v
git rebase --abort
reset soft
gitflow release 發佈新版本linux
git flow release start v0.5.0 npm version minor git flow release finish -n git push git checkout master git push
gitflow hotfix 修復一個master上的buggit
git flow hotfix start foo npm version patch // 注意:必定要在修復bug代碼以前新增版本號 git add . git commit -m "version change message" git flow hotfix finish -n git push git checkout master git push
對比2個分支的日誌程序員
git log develop..master
合併master代碼到featuregithub
git checkout feature git merge master
git merge master feature
git rebase衝突時怎麼辦web
resolve conficts git add . git rebase --continue
squash多個commits成一個怎麼敲?
假設merge feature到master。面試
git checkout master git merge --squash feature git commit -m "這是一次squash commit" git push
查看當前分支的父分支npm
git reflog show <childBranch> 32c3956 (HEAD -> currentBranch, origin/fatherBranch, fatherBranch, list) childBranch@{0}: branch: Created from fatherBranch
childBranch 是你新建的分支。
fatherBranch 是它的父分支,也就是來源分支。
撤銷遠程分支錯誤提交
...reset git push --force
其實使用本地分支的提交替代遠程分支。
誤刪除領先遠程的本地分支如何恢復?
git reflog // 找出最新的commit sha1值,HEAD@{1}比HEAD@{2}新 git branch branchName <sha1>
經過git reflog找到一個commit,而後再cherry-pick也能夠。
刪除由npm version patch/minor/major誤添加的tag
git tag | grep v1.1.38 git tag -d v1.1.38 git push origin :refs/tags/v1.1.38
git fetch與git pull的區別
git fetch 更新origin/*下的全部分支,在發佈git flow feature前頗有用,用於更新remote分支。 git pull 主要用來更新多人合做的當前分支,多用於更新local分支。
遠程分支刪除,本地git fetch不能更新到最新分支
git fetch --prune
--prune
Before fetching, remove any remote-tracking references that no longer exist on the remote.
及時查看本地全部分支的狀態
git remote show origin
假如遠程已不存在這個分支,git fetch --prune也更新不到狀態,該怎麼辦?
git push origin --delete feature/fix-chat-unread-msg-async
刪除單個脫離的遠程分支
git remote prune <name>
git merge --abort
git revert Head/[commit hash]
ssh-keygen -t rsa -C "gaokai20100801@qq.com"
/c/Users/frank/.ssh/id_rsa.pub
cd ~/.ssh
ls
cat id_rsa.pub
誤刪除stash,該怎麼辦?
git fsck --unreachable | grep commit | cut -d\ -f3 | xargs git log --merges --no-walk --grep=WIP
找到對應的commit hash值
git stash apply 1f55da93d26cd51f15f9e93351dae6b75e25e36f
.idea修改老是會提醒,.gitignore不生效.idea/
git rm -r --cached .idea
git remote -v
查看origin表明的地址。Git的system,global和local參數分別表明什麼?
--system能夠輸出不少git的系統設置,其中最有用的是alias,例如git s表明了git status,系統全部登陸用戶有用。 --global輸出了git的全局設置,主要包括全局的user.name和user.email,優先級低於單個倉庫中設置的user.name和user.email,當前用戶全部倉庫有用。 --local輸出了git的項目設置,主要包括remote.origin.url以及gitflow的不少配置,只對某個倉庫有用。
Git工做區和暫存區的區別?
add commit 工做目錄---->暫存區---->版本歷史
暫存區:git已經得到了對文件的管理權限,暫存區文件有狀態:new file,deleted,modified等等。
版本歷史:git log查看每一次commit記錄。
意外收穫:
如果想很是細粒度的控制commit記錄,可使用git add 指定文件,分開屢次commit,每一次commit提交一個細粒度功能的變動文件集合,屢次走文件目錄 暫存區 版本歷史這個流程。
Git如何重命名文件?
git mv README.md readme.md
git rm --cached -r .idea // **--cached僅僅刪除index**,-r(recursive)遞歸刪除.idea目錄下的全部文件
git rm
刪除index上和working tree上的文件,僅僅刪除working tree不刪除index的狀況,不存在。
如何一目瞭然地區分出工做區和暫存區?
// 版本歷史 Your branch is ahead of 'origin/master' by 1 commit. (use "git push" to publish your local commits) // 暫存區 Changes to be committed: (use "git reset HEAD <file>..." to unstage) renamed: readme.md -> README.md new file: helloman // 工做區 Untracked files: (use "git add <file>..." to include in what will be committed) hi
git log --oneline
簡潔的commit記錄git log -n2 --oneline
最近的2次簡潔的commit記錄git log --all
全部分支的歷史版本信息git log --graph
圖形化查看版本演進歷史git log --oneline --all -n4 --graph
組合查看日誌git help --web log
瀏覽器查看git log
的用法gitk
無需安裝第三方插件,在純命令行下,無第三方軟件狀況下可用。HEAD
工做分支refs/heads/fooconfig
repo的配置信息refs
heads,分支;tags,標籤或者里程碑refs/heads/master
存放了什麼,最新的一個commitrefs/tags/js01
存放了什麼,最新的一個tag,包含一個objectobjects
文件夾,2個字符的和鬆散的pack文件夾,存放的是tree,tree下有blob文件如何判斷git文件的類型?git cat-file -t/-p [hash fragment]
// -t 類型,-p 內容
只要任何文件的文件內容相同,在git眼裏,它就是惟一的一個blob。
commit tree // 位於objects目錄下 blob // 位於objects目錄的二級目錄下,具體的文件
tree:取出一個commit,存放了一個快照,這個快照,對應了當前項目的全部的文件夾及其文件的快照,是特定時間的整個倉庫的一個狀態;樹裏能夠有blob,也能夠有樹,由於樹是文件夾;根樹是最大的樹。
blob: 與文件名是否相同無關,只要內容相同,就是惟一的blob。
一個commit包含了哪些?
git cat-file -p [commit hash fragment]
包含tree,parent,author和commiter。
tree f06f7f36af17cb9098031c66d22a7910c0fa1bac parent 92a55c8a5b1d38d224232ad84b9b728ae77189cb parent eda632a1f2a3ea049c5f5268f6b2f064b71898ce author FrankKai <gaokai20100801@gmail.com> 1548139120 +0800 committer FrankKai <gaokai20100801@gmail.com> 1548139120 +0800 Merge branch 'feature/chatBreakChange' into prerelease # Conflicts: # src/api/chat.js
一個tree包含了哪些?
git cat-file -p [tree hash fragment]
包含tree,blob。
blob 0b96f21c27a3759cecde02fba1e050d86a8e9a54 yarn.lock
一個blob包含了哪些?
git cat-file -p [tree hash fragment]
就是一個具體的文件。
git checkout [commit hash fragment]
,切換到分離頭指針狀態,不與任何branch或tag關聯,git會認爲這是不重要的,當成垃圾清理掉。缺點:切換分支後,須要用git branch [branch name] [commit hash fragment]
新建一個分支,不然會丟失原消息。
優勢:能夠基於某一次commit切出分支,而後新建一個commit,快速會退到想要的版本。
能夠指向分支或者commit,但其實分支歸根結底仍是指向了commit。
git log 查看HEAD指針指向的分支名:(HEAD->foo, bar, master)
能夠快速diff,git diff HEAD [commit hash fragment]
。
父親的父親diff:git diff HEAD HEAD~2
,git diff HEAD HEAD^^
。
git commit --amend
如何修改老舊commit的message?
git rebase -i [父 commit hash fragment] reward 添加修改後的commit message
注意:不能在團隊的集成分支上,作這樣的變動,僅適用於本地。
git比較聰明,它不會徹底將本地的代碼扔掉,即便沒有人爲的生成一次commit記錄,也會自動爲咱們在stash下生成一次記錄,以避免形成重大的代碼丟失。
版本號升級 | gitflow對應 |
---|---|
bug -> patch | hotfix |
feature->minor | release |
系統重構->major | release |
可是在scrum的狀況下,迭代很是快速,若全部feature都升級minor,會致使minor數字很大,該怎麼處理這種狀況?
只升級minor時,在commit提交信息中,添加如下信息:
類型 | 提交信息 |
---|---|
bug patch | [bug patch] |
feature patch | [feature patch |
建立一個新的項目並上傳到git
git init git ac git remote add origin remote repository URL
git參數--decorate是什麼?
清空全部本地git 緩存
git rm -r --cache .
一次完整的rebase流程
git rebase --continue
git reset 刪除某個commit以後的代碼,原理是Head向後退。有存在被回滾掉的commit分支代碼合併過來時,被reset掉的代碼仍然會合並上來
縮寫 | 全寫 |
---|---|
gst | git status |
gaa | git add . |
gcmsg "" | git commit -m "" |
gp | git push |
glog | git log --oneline --decorate --graph |
gl | git pull |
gf | git fetch |
gfa | git fetch --all --prune |
glog --decorate=no
期待和你們交流,共同進步:
- 微信公衆號: 大大大前端 / excellent_developers
- Github博客: 趁你還年輕233的我的博客
- SegmentFault專欄:趁你還年輕,作個優秀的前端工程師
努力成爲優秀前端工程師!