一份工做4年前端的Git備忘指南

剛畢業的時候用過極短期的SVN,後面就一直在用Git來作代碼的版本控制了,前先後後差很少4年的時間,期間作了一些在使用Git過程當中的記錄和心得,在這裏分享給你們,你們或許能夠從中吸取到一些有用的東西。css

不管是github,仍是gitlab,仍是其餘的代碼託管平臺,代碼管理都是用git去作的,git能夠說是一名程序員的必備技能,對於工做和麪試都是很是有幫助的。html

  • Git經常使用命令
  • 優雅使用Git的一些實踐
  • oh-my-zsh 經常使用命令

Git經常使用命令

  • git克隆遠程分支倉庫:

git clone -b 分支名稱 遠程地址前端

git克隆遠程倉庫項目時若是不指定分支,只會克隆默認分支的內容。linux

  • 查看git用戶名和郵箱
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值](切換分支並直接切換過去)
複製代碼
  • 查看git歷史

historygit

  • 按照關鍵詞搜索git歷史

history | grep push程序員

  • 查看commit歷史
git log
git log --summary
複製代碼
  • 設置git帳號
git config --global user.name "foo"
git config --global user.email foo@gmail.com"
git config user.name "foo"
git config user.email "foo@gmail.com"
複製代碼
  • 查看git帳號
git config --global --list
git config --local --list
複製代碼
  • 僅僅查看某一項的配置

git config --local user.namegithub

  • 回滾本次修改
git reset HEAD foo.js
git checkout -- foo.js
複製代碼
  • 查看本次修改的代碼
git diff
git diff HEAD
git diff --staged
複製代碼
  • 提交後發現丟了幾個文件沒有提交
發現丟了修改記錄,從新添加
git add "*.html"
從新提交,最終只有一個提交
git commit --amend
複製代碼
  • 緩存某種後綴的文件

git add "*.js"web

  • 清除緩存區中的文件

git reset octofamily/octodog.txt面試

  • 完全刪除某種後綴的文件

git rm "*.txt"npm

  • 合併分支到master

git merge 分支名

  • add .以前取消提交某些文件

git checkout -- <filename>

  • 藏代碼到髒目錄(適用於其餘成員修改了相同分支代碼,但又不想提交)

git stash

  • 釋放髒目錄代碼

git stash pop

  • 釋放指定髒目錄代碼

git stash pop stash@{0}

  • 刪除遠程分支(此分支必須是非默認分支)

git push origin --delete branchname

  • 已經commit,強制回退到舊版本
git log//找到commit hash值
git reset --hard hash值
複製代碼
  • 查看stash目錄

git stash list

  • 刪除某一個stash

git stash drop stash@{0}

  • 設置遠程倉庫地址

git remote set-url origin git@foo.bar.com:baz/helloworld.git

  • 本地建立了新分支,可是orgin沒有,push代碼前

git push --set-upstream origin preproduction

  • 指定tag到遠程

git push origin <tag_name>

  • 將所有tag打到遠程

git push --tags

  • 查看當前tags

git tag --list

  • 僅僅刪除index不刪除working tree上的.idea文件

git rm --cached -r .idea // --cached僅僅刪除index,-r(recursive)遞歸刪除.idea目錄下的全部文件

  • git主動track文件,控制文件,作好提交準備

git add <file(s)>/.

  • git unstage文件,釋放文件,選擇性控制

git reset HEAD <file(s)>/.

  • 暫存區文件如何覆蓋工做目錄文件

git reset HEAD <file(s)>/. && git checkout -- <file(s)>/.

  • 提交已經被git管理的,modified爲紅色的全部文件

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!
複製代碼
  • 查看項目的origin表明的地址

git remote -v

  • pick中途誤退出

git rebase --abort

  • 未同步到remote,從新提交

reset soft

  • gitflow release 發佈新版本
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上的bug
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代碼到feature
git checkout feature
git merge master
複製代碼
git merge master feature
複製代碼
  • git rebase衝突時怎麼辦
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
複製代碼
  • 查看當前分支的父分支
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分支。
// https://www.git-tower.com/learn/git/faq/difference-between-git-fetch-git-pull
複製代碼
  • 遠程分支刪除,本地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>
複製代碼
  • 取消一次合併(merge)

git merge --abort

  • 回退一次commit

git revert Head/[commit hash]

優雅使用Git的一些實踐

  • windows下gitbash支持中文輸入:
1)鼠標左鍵點擊左上角git的logo
2)找到options而且切換到text目錄,將Character set設置爲UTF-8
複製代碼
  • 生成ssh-key

ssh-keygen -t rsa -C "gaokai20100801@qq.com"

  • windows查看ssh-key

/c/Users/frank/.ssh/id_rsa.pub

  • mac/linux查看ssh-key

cd ~/.ssh ls cat id_rsa.pub

  • git flow

danielkummer.github.io/git-flow-ch…

  • 誤刪除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中的origin是什麼?

origin是一個變量,表明着一個git倉庫地址。可使用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的working tree和index是什麼意思?
index指的是git索引,能夠理解成git有文件的一個複製,僅刪除index則僅刪除存在於git中的文件。
working tree則是指操做系統的工做樹,也就是操做系統的磁盤上存儲的文件。
舉兩個經常使用的例子:
1. 僅刪除git index中的文件,.idea等IDE隱藏的工做樹文件是不能刪除的:**--cached**
git rm --cached -r .idea // **--cached僅僅刪除index**,-r(recursive)遞歸刪除.idea目錄下的全部文件
2. 刪除index和working tree上的文件,恩斷義絕

git rm 刪除index上和working tree上的文件,
僅僅刪除working tree不刪除index的狀況,不存在。
複製代碼
  • nothing to commit 和 working tree clean?
暫存區沒有能夠提交到版本歷史的內容。
工做區也是乾淨的。
複製代碼
  • 如何一目瞭然地區分出工做區和暫存區?
    • Your branch is ahead of 'origin/master' by 1 commit 版本歷史
    • Changes to be committed 暫存區
    • Untracked files 工做區
// 版本歷史
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的命令文檔?

git help --web log 瀏覽器查看git log的用法

  • git自帶的圖形化界面怎麼看?

gitk 無需安裝第三方插件,在純命令行下,無第三方軟件狀況下可用。

  • git 裏的做者和提交人不同嗎?

做者是代碼的生成者,是爲了版權保護。

  • 神祕的.git目錄
HEAD 工做分支refs/heads/foo
config repo的配置信息
refs heads,分支;tags,標籤或者里程碑
refs/heads/master 存放了什麼,最新的一個commit
refs/tags/js01 存放了什麼,最新的一個tag,包含一個object
objects 文件夾,2個字符的和鬆散的pack文件夾,存放的是tree,tree下有blob文件
複製代碼

能夠直接經過vim修改HEAD,config等信息,和命令的做用是相同的。

  • 如何判斷git文件的類型?

git cat-file -t/-p [hash fragment] // -t 類型,-p 內容 只要任何文件的文件內容相同,在git眼裏,它就是惟一的一個blob。

commit  
tree // 位於objects目錄下
blob // 位於objects目錄的二級目錄下,具體的文件
複製代碼
  • tree, commit, blob的區別?
commit:一個commit確定會對應一棵樹,包含了根tree,author,committer,parent等等一個commit對象的信息。
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。

100644 blob 015aaf344153ed7822069b2a98898b7d7a215b0d    .babelrc
100644 blob 9d08a1a828a3bd2d60de3952744df29f9add27fa    .editorconfig
100644 blob 080140b833db5b758b1eb869a269f4bbb068a19e    .eslintignore
100644 blob 8f777c376c0314e480f9bbba273d4902810bcb11    .eslintrc.js
100644 blob 895e844218637929546ed2295ae90f991ceb5d38    .gitignore
100644 blob db7b635d23657349dbe4c33cc353ef4efd8ca960    .npmrc
100644 blob 797e871f4b8c0a3071e8b6ab2cc40b804cd2971c    .postcssrc.js
100644 blob d3983c1d6a5525aae58b823448723434ca83ceed    .prettierrc
100644 blob 93cc7473ab066204f3329221111a945e2dc83576    BUS.md
100644 blob defc3d9914d1af08e6670b96995261bfe1fb61a6    CHANGELOG.md
100644 blob bfd46fd4008cbe7103181fc5cd64392a74426e96    MQTT.md
100644 blob abdb55935d833dd4f4b79475aa7d63ffcb0cc9cd    README.md
040000 tree f1f80f844bb80389826198a15ec0f224a53525f8    build
100644 blob 2aefa3130f4ff753b5c3e538db53b9b186f12540    index.html
100644 blob 967b8f243420a9a8a07b8f429f0a7ba874a834ad    package-lock.json
100644 blob 35d9fa46f569395b25a87daef4820de42d071831    package.json
040000 tree f6bdc675a8f9af805867b5a19c263e5bbfe4c26c    src
040000 tree 09e231414b91779326447a0c8d5b3421aa2308c2    static
040000 tree ad94369cfdd2038a552e44fc0abbd1738113b5e6    test
100644 blob 0b96f21c27a3759cecde02fba1e050d86a8e9a54    yarn.lock
複製代碼
  • 一個blob包含了哪些?
git cat-file -p [tree hash fragment]
就是一個具體的文件。
複製代碼
  • detached HEAD是什麼?
分離頭指針。
`git checkout [commit hash fragment]`,切換到分離頭指針狀態,不與任何branch或tag關聯,git會認爲這是不重要的,當成垃圾清理掉。
缺點:切換分支後,須要用`git branch [branch name] [commit hash fragment]`新建一個分支,不然會丟失原消息。
優勢:能夠基於某一次commit切出分支,而後新建一個commit,快速會退到想要的版本。
複製代碼
  • HEAD能夠指向什麼?
它位於.git/HEAD。
能夠指向分支或者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^^`。
複製代碼
  • 如何修改最新一次commit的message?

git commit --amend 注意:不能在團隊的集成分支上,作這樣的變動,僅適用於本地。

  • 如何修改老舊commit的message?
git rebase -i [父 commit hash fragment]
reward
添加修改後的commit message
注意:不能在團隊的集成分支上,作這樣的變動,僅適用於本地。
複製代碼
  • git stash pop stash@{n}還能作什麼操做?
當前分支的本地代碼未提交的狀況下,pull了領先的遠程分支代碼,此時遠程代碼會覆蓋本地代碼。
git比較聰明,它不會徹底將本地的代碼扔掉,即便沒有人爲的生成一次commit記錄,也會自動爲咱們在stash下生成一次記錄,以避免形成重大的代碼丟失。
複製代碼
  • gitflow模式下,如何規範版本發佈?
版本號升級 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是什麼?

    • 有short,full,auto,no幾種值,--decorate=short
    • 打印出commit的ref name。
    • short時,ref name 前綴refs/head,refs/tags/和refs/remotes不會打印
    • full時,完整前綴會被打印
    • auto時,若是輸出是一個終端,會按照short的方式打印;非終端會顯示所有
    • no時,會隱藏HEAD和tag等等refs信息
    • 默認值是short
  • cherry pick是什麼?

如何理解git cherry pick?

  • 清空全部本地git 緩存
git rm -r --cache .
複製代碼
  • error Command "husky-run" not found

rm -rf .git/hooks/

  • 一次完整的rebase流程
1. git checkout feature
2. git rebase master
3. resolve conflicts
4. git add .
5. git rebase --continue
複製代碼
  • git revert和git reset的區別
git revert 生成一個新的commit的方式回滾到上一個或者指定commit版本的代碼,原理是Head繼續前進。有存在被回滾掉的commit分支代碼合併過來時,代碼正常被合併

git reset 刪除某個commit以後的代碼,原理是Head向後退。有存在被回滾掉的commit分支代碼合併過來時,被reset掉的代碼仍然會合並上來
複製代碼

oh-my-zsh 經常使用命令

縮寫全寫對照表

縮寫 全寫
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默認是short,我想指定glog的decorate爲no,要怎麼作?

glog --decorate=no

期待和你們交流,共同進步:

努力成爲優秀前端工程師!

相關文章
相關標籤/搜索