三大區域: 工作區 → 緩存區 → 本地倉庫
一 、
? ??使用 git config 命令進行配置:
? ? git config --global user.name "<用戶名字>"
? ? git config --global user.email "<用戶郵箱>"
? ? 配置完成后,家目錄下會生成 .gitconfig 文件。
? ? ssh-keygen -t rsa:本地生成 SSH 密鑰對,用戶家目錄下生成 .ssh 目錄,復制此目錄里公鑰的內容到 github 的相關處,設置 SSH 直連
二 、
? ??git 要求對本地倉庫關聯的每個遠程主機都必須指定一個主機名,用于本地倉庫識別自己關聯的主機,git remote 命令就用于管理主機,一個本地倉庫可以關聯多個主機
? ? git clone <URL>:克隆一個遠端倉庫到當前目錄,執行此命令后,當前這個克隆來的新倉庫就關聯到了遠端,也就是主機,默認新建的本地倉庫名和遠端倉庫名一致,默認主機名為 origin,默認分支為 master。同時,這個遠端倉庫的所有分支也一并被克隆到了本地倉庫,但這些分支不會出現在 git branch 的列表中,因為它們是隱式分支,不同于上游分支,上游分支是指本地分支跟蹤的遠端分支,執行 git branch -r 可以看到這些隱式分支
? ? 關于上個命令的補充:如果此時執行 git checkout dev 切換到分支 dev(這個分支 dev 需要在遠端有同名分支,所以才能不用新建直接切換),那么本地的分支列表里就有了 dev 分支,同時這個本地分支 dev 已經關聯到了遠端同名分支,這個遠端同名分支又叫前者的上游分支,而且此時本地分支和隱式分支的代碼版本一樣。這時回到主分支,執行 git merge dev 和 git merge origin/dev ,雖然結果相同,但是本質上不同:前者是合并本地分支 dev,后者則是合并遠端傳進來的隱式分支 origin/dev 。如果在 dev 分支上提交但不推送,origin/dev 的版本無變化;如果在 dev 分支上推送提交到遠端,那么 origin/dev 這個隱式分支的代碼版本會自動更新
? ? git clone -o <haha> <URL> :結果同上個命令,只是把預設的主機名改成了 haha
? ? git clone <URL> <hello> :克隆一個遠端倉庫到當前目錄,并把這個克隆得到的本地倉庫更名為 hello
? ? git init:將當前所在目錄變成本地倉庫
? ? git remote add <主機名> <URL>:把當前本地倉庫關聯(跟蹤)到 github 遠程倉庫,注意主機名不可同名。此命令不會把該主機的遠程分支信息都添加到本地倉庫成為隱式分支,因為這個命令沒有在本地生成與之關聯的顯式分支,這一點與 git clone 不同
? ? git remote rename <one> <two> :修改主機名 one 為 two
? ? git remote -v:查看本地倉庫關聯的主機信息(主機名和網址)
? ? git remote set-url <origin> <URL>:修改當前倉庫關聯(跟蹤)的遠端倉庫網址,origin 為主機名
? ? git remote rm <origin>:刪除本地倉庫與遠端的關聯,即刪除與主機 origin 的關聯
? ? git remote remove <origin> :同上
三 、
? ??git status:查看當前分支的全部區域狀態
? ? git add <file>:添加工作區的文件修改到暫存區
? ? git add <A/*>:添加工作區 A 目錄下的全部修改到暫存區
? ? git add .:添加全部修改到暫存區
? ? git ls-files :查看已經被跟蹤的文件列表
? ? git diff:查看未添加到緩存區的修改(不包含未被跟蹤的文件,即新建的且未使用過 git add 添加到緩存區的新建文件)
? ? git diff --cached:查看已添加到緩存區的修改
? ? git diff <版本號1> <版本號2> :查看相對于版本 1 來說,版本 2 的不同(通常版本 1 要早于 版本 2)
? ? git diff <dev2> :和分支 dev2 比,當前分支有什么不同,比的是全部三大區域
? ? git diff <dev2> <file1> :和分支 dev2 比,當前分支有什么不同,只比較文件 file1
? ? git checkout -- <file>:撤銷此文件未添加到緩存區的修改(對未被跟蹤的文件無效)
? ? git checkout .:撤銷全部未添加到緩存區的修改(對未被跟蹤的文件無效)
? ? git rm --cached <file>:撤銷已添加到緩存區的修改
? ? git reset -- <file>:撤銷已添加到緩存區的修改
? ? git reset --:撤銷緩存區的全部內容
? ? git commit -m '<備注>':提交緩存區的修改到本地代碼庫
? ? git commit -a -m '<備注>':將沒有加到緩存區的修改一并提交,但 -a 選項不會添加未被跟蹤的文件
? ? 關于忽略文件的配置文件:在本地倉庫的根目錄下創建文件 .gitignore ,并將此文件提交,即生效。但是已經提交的文件中如果有符合忽略規則的,就管不了了,人家已經上船了
四 、
? ? git log <dev>:查看分支 dev 的提交歷史記錄,即使用 git commit 命令的記錄(默認是時間倒序,最近的提交排在最上面),不寫分支名查看當前分支的提交歷史記錄
? ? git log --reverse:時間正序顯示提交歷史記錄
? ? git log --oneline:一行顯示提交歷史記錄
? ? git log --graph :圖示法顯示提交歷史
? ? git log --reverse --oneline --graph?:時間正序 + 一行顯示 + 圖示法顯示
? ? git log -n :顯示最近的 n 個提交
*? ? git log -p :不知道啥玩意
? ? git log --author <作者> :查看指定作者的提交記錄
? ? git reset --hard HEAD^ / HEAD~1:退回上一個版本(HEAD 就是指向 master 的指針)
? ? git reset --hard HEAD^^ / HEAD~2:退回上兩個版本
? ? git reset --hard <版本號>:進入到此版本
*? ? git reset --soft <版本號> :軟退回,待補充
? ? git reflog:查看本地版本變化記錄,包括提交、退回和切換分支。這個記錄是本地記錄,它是不會被傳到遠端的,刪除本地倉庫后,就沒了
? ? git reset --hard HEAD@{n}:退回到最近 n 次本地版本變化前
五 、
? ??git branch:查看本地分支列表
? ? git branch -vv :查看本地分支列表詳情(包括分支名、關聯信息和最新提交信息),這里可以寫倆 v ,可以寫八個 v ,都沒事兒
? ? git branch -r:查看遠端分支列表(此命令不聯網),所謂遠端分支,就是本地隱式分支
? ? git branch -a :查看本地和遠端(也就是本地隱式分支)所有分支 (此命令不聯網)
? ? git branch -a -vv:綜上所述(可簡寫為 git branch -avv)
? ? git branch -d / -D <dev>?:刪除本地分支 dev ,可以一次刪除多個,此命令不能在 dev 分支下進行
? ? git branch -rd <origin>/<dev> :刪除本地隱式分支 origin/dev
? ? git branch -m <dev1> <dev2> :將本地分支 dev1 重命名為 dev2
? ? git push origin :<dev> :刪除主機為 origin 的遠程分支 dev
? ? 關于查看分支的命令的補充 :以上所有 branch 命令都是針對本地倉庫關聯的主機,實際上顯示的都是本地分支,只是有顯式、隱式之分而已。既然這些命令都不聯網,如何獲得遠端分支(也就是本地隱式分支)的信息呢?真相就是執行 git clone 時,會傳進來該主機全部的遠端分支信息,這些遠端分支被稱為本地隱式分支,執行 git fetch 命令可以刷新這些信息,執行 git push 時也會刷新當前分支關聯的隱式分支信息,執行 git pull 時,除了刷新當前主機的全部遠端分支信息外,還拉取了當前分支的遠端分支提交,如果當前分支版本不低于它所關聯的遠端分支,那么執行 git pull 與執行 git fetch 作用一樣。所有關聯到遠端的本地分支的都有對應的隱式分支在本地。注意:這些命令刷新本地隱式分支信息,只對當前分支所屬的主機有效
? ? git fetch :把當前分支所屬主機的所有遠端分支的最新提交版本傳到本地倉庫(此命令需聯網),相當于刷新了全部的本地隱式分支。注意,這些傳到本地倉庫的隱式分支用 git branch -r 命令才能看到,因為它們就是遠程分支的復制版啊。重要的一點:如果遠端分支被刪除,執行此命令后,本地的同名隱式分支是不會被刪除的。如何把這些最新的隱式分支版本合并到本地分支呢?參見下一個命令
? ? git merge <origin>/<haha> :把本地隱式分支合并到當前所在分支(因為此操作不聯網,所以需先執行 git fetch 刷新一下),如果要合并同名隱式分支的話,直接執行 git merge 即可
? ? git fetch <主機名 origin> <分支名 dev> :更新任意主機的任意一個遠端分支的最新版本到本地,此命令在任何分支下執行效果都一樣
? ? git fetch <origin> <dev>:<test> :該命令會新建一個本地分支 test ,同時將遠端分支 dev (注意:這里不是本地隱式分支,此命令需聯網)的版本傳入此新建分支,但二者不自動關聯,不自動切換分支。此命令在任何分支執行,效果相同
? ? 補充 :所有 fetch 命令都需聯網,執行后都不會自動切換分支
? ? git branch <dev>:創建新分支 dev,新建分支與執行此命令時所在的分支內容一致(不聯網,不切換)
? ? git checkout <dev>:切換到分支 dev
? ? git checkout - :切換回上一個分支,此命令類似于 Linux 命令 cd -
? ? git checkout -b <dev>:創建新分支 dev 并切換到此分支,新建分支與執行此命令時所在的分支代碼版本一致。
? ? 注意:以上新建分支的命令不聯網,得到的新建分支未與遠端同名分支產生關聯,所以不能直接 git pull 或 push 。關于如何在不關聯遠端分支的情況下推送以及如何關聯遠端分支,參見下文第六部分
? ? git checkout -b <haha> origin/<dev> :創建新分支 haha 并切換到此分支,同時將本地隱式分支 dev 的全部內容拉取到此新建分支,此時新建分支已經關聯到遠端分支 dev,其中 origin 為主機名,這步操作也不聯網。由于這個新建分支和與之關聯的遠端分支不同名,所以無法直接使用 git push 命令推送。如果 dev 是 master,可以省略
? ? git merge <dev>:合并本地分支 dev 的所有提交到當前分支。合并遠程分支(也就是本地隱式分支也差不多,詳見上面。所有的 merge 操作都不聯網。如果當前分支版本高于 dev 分支,合并無效
? ? git merge --squash <dev> :合并本地分支 dev 到當前分支,只合并文件修改,不合并提交,log 是沒變化的。執行此操作后這些修改就已經在當前分支的暫存區,等待提交。當然合并隱式分支也是一樣的
? ? git rebase <dev> :也是把 dev 分支合并到本地分支(dev 可以是本地顯式分支,也可以是本地隱式分支)。幾點補充:1、如果合并的分支起了沖突,修改沖突文件并添加到緩存區,然后執行 git rebase --continue,若是不想合并了,執行 git rebase --abort 即退回到合并前的狀態;2、因為 rebase 是基于的意思,也就是基于 dev 分支進行的合并,合并成功后,兩條分支的所有提交保留,并且不產生新的提交,dev 的提交記錄在前,當前分支的提交記錄在后;3、如果當前本地分支版本高于 dev,那么合并無效。它和 git merge 的區別參見?此鏈接 ,里面的圖中,箭頭畫反了
? ? git pull --rebase origin <dev> :把遠端分支 origin/dev 合并到當前本地分支,注意是遠端分支不是本地隱式分支,因為該命令有了 pull ,所以聯網。其它說明參見上個命令。很多人說它相當于執行了 git fetch 后又執行了 git rebase,其實不對,這就是與上一個命令第 3 點補充不同的地方,如果沒有產生沖突,分兩種情況:1、若本地分支的高版本曾推送到遠端,此命令可以將遠程分支的低版本覆蓋當前分支的高版本;2、若本地分支的高版本未曾推送至遠端,則此命令無效
? ? 所有本地分支之間有一種特殊的關系:如果你對一個分支進行了修改(不執行 commit), 可能的話,那么所有的分支立刻都有了相同的修改,不管各分支現在處于哪個版本、關聯到遠端與否,切換分支后就能看到。但是盡量少利用這個特性。切換分支要謹慎。(其實本質上只是 HEAD 指針的移動而已,移來移去,一不小心就可能把這些未提交的修改給弄掉地上摔碎了,因為沒有提交,所以就再找不回來了)
六 、
? ? git push <origin> <dev>:推送分支 dev 的所有內容到主機為 origin 的遠端倉庫的同名分支,若遠端倉庫沒有 dev 分支,那么會自動創建,但不自動關聯。這個命令在任何分支上執行結果一樣。主機名隨意,隨意的原因是未關聯任何遠端的分支屬于本地倉庫的孤立分支
? ? git push <origin> <dev>:<haha> :推送?dev 分支的所有內容到主機為 origin 的遠端倉庫的 haha 分支,其它內容同上
? ? 關于上面兩個命令的補充:對未關聯到遠端的分支才會用這些命令,已關聯的直接在那個分支上 push 了。此命令不能使原本未關聯到遠端的當前分支關聯到遠端同名分支,盡管它能推送提交,但是,如果之前關聯過,后來失聯了,這個命令可以復聯。執行?git branch -u?命令可以使當前分支關聯到遠端分支。注意:只有關聯到遠端同名分支的本地分支才可以使用 git push 推送
? ? git branch -u <origin>/<dev1> <dev2>?:將本地分支 dev2 關聯到主機名為 origin 的遠端分支 dev1 (此命令可以在任何分支下進行)
? ? git branch --unset-upstream <dev> :解除本地分支 dev 與遠端的關聯。如果當前分支為 dev,分支名參數可省略
? ? git push --set-upstream <origin> <dev> :推送分支 dev 到主機名為 origin 的遠端同名分支,遠端若無此分支,自動新建。此命令中主機名 origin 隨意,隨意的原因是未關聯任何遠端的分支屬于本地倉庫的孤立分支
? ? git push --set-upstream <origin> <dev>:<haha> :推送分支 dev 到主機名為 origin 的遠端分支 haha ,其它內容同上個命令
? ? 補充?:上面兩個命令中的 --set-upstream 都可以用 -u 代替
? ? git push <origin> :<dev> :刪除主機名為 origin 的遠端倉庫分支 dev (它可以在任何分支下進行且結果都一樣)
? ? git push <origin> :<dev1> :<dev2> :<dev3> :一次性刪多個
? ? git push <origin> --delete <dev>:同上
? ? git push :與遠端同名分支建立關聯后,用此命令推送提交到遠端,如果本地版本低于遠端分支,這個就不好使了,只能強推
? ? git push -f :強行推送(即利用強行覆蓋的方式將你的本地倉庫代碼推送至遠端倉庫)
? ? git push --all :將所有本地分支最新提交推送到遠端同名分支,沒有的自動創建。某些情況下,比如本地分支 a 原來已經關聯到遠端分支 b,之后這個遠端分支 b 又被刪了,此時執行此命令會自動生成遠端 a 分支,但遠端 a 分支沒有和本地 a 分支關聯過,所以二者不能自動關聯。如果執行此命令前本地分支 a 就關聯了遠端同名分支 a ,后來遠端分支 a 被刪了,這種情況下執行此命令,會新建遠端分支 a ,順便自動關聯到本地分支 a
? ? git push -u --all :將所有本地分支最新提交推送到遠端同名分支并關聯,沒有的自動創建
? ? git pull :此操作刷新了該分支所屬主機的所有本地隱式分支,類似 git fetch 。同時如果當前本地分支版本低于它所關聯的遠端同名分支,則該分支也自動更新版本,如果不低于,不更新,如果不關聯,那肯定也不更新
? ? 注意:這個 git pull 和 git fetch 只是把遠端倉庫的分支信息覆蓋到了本地隱式分支,如果遠端分支被刪除,執行這倆命令后,本地同名隱式分支是不受影響的,它不會被刪除。那么這種情況下,如何刪除這個本地隱式分支呢?參見下個命令
? ? git remote prune <origin> :刪除無效的本地隱式分支,無效的意思就是遠程同名分支已經沒有了,它還在這兒呆著呢。此命令聯網。關于 remote 的其它命令,參見第二部分
? ? git fetch -p :刷新本地隱式分支同時刪除無效的隱式分支,相當于執行了 git fetch 和 git remote prune 兩個命令
? ? git pull <origin> <dev> :從主機為 origin 的遠端分支 dev 獲取最新版本到本地倉庫當前分支,與命令 git merge origin/dev 效果不同,后者合并的是本地隱式分支
七 、
? ??git config --global alias.<st> '<status>':設置簡潔命令
? ? git log --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit --date=relative:一個比較清晰的 log 一行顯示
? ? git config --global color.ui true:開啟 git 輸入著色
? ? git config --global core.quotepath false:設置顯示中文文件名
? ? git config -l:查看 git 配置