天天看點

有用的git建議

這篇文章的目的是給經常使用git管理項目提供一個有益的提醒。如果你是git新手,可以先閱讀文後的引用部分,然後在回頭閱讀此篇文章。在介紹git指令之前,你可以先看看來自 on-my-zsh 提供的别名。

基本指令

  • git config --global user.name "Your Name"

  • git config --global user.email "[email protected]"

  • git config --global core.editor <your favorite editor here>

    • Ex: 

      git config --global core.editor vim

  • git init

     :初始化一個repo。

Commit 結構

  • git status

     ( 

    gst

     ):檢視 repo 狀态
  • 工作區:
    • .git 目錄
    • 暫存區
    • 工作目錄
  • git add <filename>

    ga

     ):添加一個檔案到暫存區
  • git add .

    gaa

     ):添加所有檔案到暫存區
  • git add *.js

     :添加所有字尾為js的檔案到暫存區
  • git rm --cached <file>

     :從暫存區删除一個新檔案
  • git commit -m "My first commit"

    gcmsg

     ):建立一次帶 message 的送出
  • git commit -v -a

    gca

     ):
    • -v

       是 verbose 的縮寫,會在底部顯示差異資訊和更多有意義的資訊
    • -a

       類似于 

      git add .

       ,會添加所有被修改和删除的檔案,但會忽略新建立的檔案
  • git help <command>

     :檢視對應指令的幫助手冊
  • git log

    glg

     , 

    glgg

    glo

    glog

     ):檢視項目的送出曆史

暫存區管理

  • git reset HEAD <filename>

    grh

     ):從暫存區删除一個被修改的檔案
  • git reset HEAD

    grh

     ):從暫存區删除所有被修改的檔案
  • git checkout <filename>

    gco

     ):從暫存區删除一個被修改的檔案,并撤銷檔案的更改
  • git commit -m "My first commit" --amend

     :添加檔案/更改在暫存區的最後一次送出
  • git commit -v -a --amend

    gca!

     ):添加檔案/更改在暫存區的最後一次送出
  • .gitignore

     :告訴git,哪些檔案不被加入版本跟蹤
    • 可以使用 

      git add <filename> -f

       指令添加一個不被版本跟蹤的檔案
  • git diff <filename>

    gd

     ):檢視基于目前檔案的最後一次送出的更改差異
  • git diff

    gd

     ):檢視基于所有檔案的最後一次送出的更改差異
  • git reset HEAD~2 --soft

     :從項目送出曆史中删除最近兩次送出,但不丢棄檔案的更改
  • git reset HEAD~2 --hard

     :從項目送出曆史中删除最近兩次送出,但會丢棄檔案的更改和在(最後兩次)送出中建立的新檔案
  • git reset <commit> --soft --hard

     :
    • --soft

       :将所有被更改的檔案回溯到“待送出”狀态
    • --hard

       : 

      commit

       之後,對被git追蹤的檔案的任何更改都被丢棄
  • git reflog

     :顯示包括 被撤銷 在内的所有送出
  • git merge <commit hash>

     :重新送出(restore the commit)
  • git clean -f

     :删除工作目錄中不被git進行版本追蹤的檔案

Stashed & Branches

Stash

  • git stash

    gsta

     ):将所有暫存區的檔案移動到“儲藏區”,類似于另一種類型的工作區
  • git stash list

     :檢視儲藏隊列(Stash lists)
  • git stash apply

     :将最近一次儲藏恢複到暫存區(可以用類似 

    git stash apply stash@{num}

     (num從0開始計數) 的指令來使用在隊列中的任意一個儲藏(stashes))
  • git stash clear

     :清空儲藏隊列
  • git stash save "name of the stash"

     :為儲藏設定命名
  • git stash pop

    gstp

     ):将最近一次儲藏恢複到暫存區并從儲藏隊列删除此儲藏
  • git stash drop

    gstd

     ):從儲藏隊列删除最近一次儲藏( 

    stash@{0}

     )(

    git stash drop stash@{num}

     從儲藏隊列删除指定儲藏)

Branch

  • git checkout -b dev

    gco

     ):建立 dev 分支并從目前分支切換到 dev 分支
  • git branch

    gb

     ):檢視所有分支
  • git checkout master

    gcm

     ):切換到主分支
  • git merge <branch>

    gm

     ):合并分支
  • git rebase master

     :先将 master 上的更改合并到目前分支,再添加目前分支的更改。如果有沖突,解決沖突後加 

    --continue

     參數繼續合并
  • git branch -d <branch>

     : 删除分支, 

    -D

     則強制删除分支
  • git merge <branch> --squash

     :将多次送出合并成一個,其流程如下:
# Go to the `master` branch
git checkout master
# Create a temp branch
git checkout -b temp
# Merge the feature/x branch into the temp using --squash
git merge feature/x --squash
# See the new modifications/files in the Staging Area
git status
# Create the unified commit
git commit -m "Add feature/x"
# Delete the feature/x branch
git branch -D feature/x
           
  • rebase 和 merge 的差別:
    • rebase:
      • 送出曆史(的展示)是線性的
      • 缺點:會删除最近一個 commit,然後建立一次新的 commit
      • 如果已送出到遠端,不要使用 rebase
    • merge:
      • 送出曆史(的展示)是分叉的
      • 對于兩個分支的合并,會建立一個次新的 commit

遠端倉庫管理

  • git remote add <name> <url>

     :添加一個将被追蹤的遠端倉庫
  • git remote rm <name>

     :移除一個遠端倉庫
  • git push <remote> <remote-branch>

    gp

    ggp

     ):将目前分支的本地 commit 推送到遠端倉庫
  • git fetch <remote> <remote-branch>

     :拉取遠端倉庫的最新 commit 到目前(本地)分支( 

    <remote>/<branch>

     ),不會合并
  • git pull <remote> <remote-branch>

    gl

    ggl

     ):拉取遠端倉庫的最新 commit 到目前(本地)分支,并自動 merge
    • git pull --rebase

      gup

       ):以 rebase 的方式進行合并,而不是 merge

其它有用的指令

  • git tag <name>

     :建立一個 tag(如:v1.3)
  • git push --tags

     :将本地 tags 推送到遠端倉庫
  • git push <tag>

     :推送指定的本地 tag 到遠端

熬夜不易,點選請老王喝杯烈酒!!!!!!!