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

image.png

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

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

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

Git經常使用命令

  • git克隆遠程分支倉庫:
    git clone -b 分支名稱 遠程地址
    git克隆遠程倉庫項目時若是不指定分支,只會克隆默認分支的內容。
  • 查看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歷史
    history
  • 按照關鍵詞搜索git歷史
    history | grep push
  • 查看commit歷史
    git log
    git log --summary
  • 設置git帳號
    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帳號
    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"
  • 合併分支到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 發佈新版本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分支。

    https://www.git-tower.com/lea...

  • 遠程分支刪除,本地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
    https://danielkummer.github.i...
  • 誤刪除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則是指操做系統的工做樹,也就是操做系統的磁盤上存儲的文件。
    舉兩個經常使用的例子:
  • 僅刪除git index中的文件,.idea等IDE隱藏的工做樹文件是不能刪除的:--cached
    git rm --cached -r .idea // **--cached僅僅刪除index**,-r(recursive)遞歸刪除.idea目錄下的全部文件
  1. 刪除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
    configrepo的配置信息
    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。

  • blob 015aaf344153ed7822069b2a98898b7d7a215b0d .babelrc
  • blob 9d08a1a828a3bd2d60de3952744df29f9add27fa .editorconfig
  • blob 080140b833db5b758b1eb869a269f4bbb068a19e .eslintignore
  • blob 8f777c376c0314e480f9bbba273d4902810bcb11 .eslintrc.js
  • blob 895e844218637929546ed2295ae90f991ceb5d38 .gitignore
  • blob db7b635d23657349dbe4c33cc353ef4efd8ca960 .npmrc
  • blob 797e871f4b8c0a3071e8b6ab2cc40b804cd2971c .postcssrc.js
  • blob d3983c1d6a5525aae58b823448723434ca83ceed .prettierrc
  • blob 93cc7473ab066204f3329221111a945e2dc83576 BUS.md
  • blob defc3d9914d1af08e6670b96995261bfe1fb61a6 CHANGELOG.md
  • blob bfd46fd4008cbe7103181fc5cd64392a74426e96 MQTT.md
  • blob abdb55935d833dd4f4b79475aa7d63ffcb0cc9cd README.md
  • tree f1f80f844bb80389826198a15ec0f224a53525f8 build
  • blob 2aefa3130f4ff753b5c3e538db53b9b186f12540 index.html
  • blob 967b8f243420a9a8a07b8f429f0a7ba874a834ad package-lock.json
  • blob 35d9fa46f569395b25a87daef4820de42d071831 package.json
  • tree f6bdc675a8f9af805867b5a19c263e5bbfe4c26c src
  • tree 09e231414b91779326447a0c8d5b3421aa2308c2 static
  • tree ad94369cfdd2038a552e44fc0abbd1738113b5e6 test
  • 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~2git 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流程

  • git checkout feature
  • git rebase master
  • resolve conflicts
  • git add .
  • 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

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

努力成爲優秀前端工程師!
相關文章
相關標籤/搜索