git指令收編整理

前言

Git做爲一個當前被最普遍使用的版本控制開發工具,是每個學習軟件開發的程序員所必須熟悉的。這裏我將全部的Git指令收編整理,列出一個簡單的表項,方便本身之後查詢。對於初學者,能夠從這個教程入手,能夠很是快的理解其內在的功能。git

指令整理

git init : 初始化當前目錄爲一個新的倉庫,該倉庫下包含一個master主分支
git init --bare : 初始化當前目錄爲一個新的倉庫,該倉庫下不包含任何內容,通常用於初始化git服務器
git clone REMOTE_URL LOCAL_REPOSITORY_NAME: 將位於REMOTE_URL上的倉庫拉取到本地而且重命名爲LOCAL_REPOSITORY_NAME
git status : 查看當前git倉庫的狀態
git add filename1 [filename2|filename3] : 將文件添加至index緩存目錄中,能夠一次性添加多個文件
git commit -m 'comment' : 將緩存目錄下變更的內容提交至倉庫中,comment中填寫備註
git commit -a -m 'COMMENT':快速提交,不通過緩存
git commit --amend: 將暫存區中的文件和上一次提交合並
git diff [-filename] : 查看當前工做區狀態和上一次提交區別,若指令中包含文件名,則是查看當前文件和上一次提交的文件的區別
git diff --staged: 查看已暫存的將要添加到下次提交裏的內容
git log : 查看變動日誌
git log [-p] [-NUM] [-stat] : -p用來顯示每次提交的內容差別, -NUM用來講明顯示最近NUM次的代碼提交, -stat用來講明每次提交的簡略的統計信息
git log --graph --pretty=oneline[full|fuller|short] : 用圖形化精簡的展現變動日誌
git reflog:查看每一次操做,能夠用來查找誤刪或者誤移的版本
git checkout -- file : 能夠丟棄工做區的修改,本質上checkout 文件指令是將工做區的文件回退至上次提交時的狀態,上次提交能夠是git commit 或git add操做,因此一旦誤刪,也能夠經過該指令從緩存中回退該文件。
git reset HEAD filename : 將倉庫中的內容覆蓋給索引去,其實這個指令等價於git reset --mixed HEAD filename,也就是將版本庫中的這個文件覆蓋緩存中的該文件
git reset [--hard|mixed|soft] [HEAD~n|commid id] : 將HEAD指針回退至以前某個提交版本,在這裏hard指強制回退,會同時刷新倉庫,緩存和工做區文件,可能會帶來數據的丟失。soft只會刷新倉庫的文件,而緩存和工做區文件不會發生變更,若是想要提交還能夠從新提交。mixed會刷新倉庫和緩存區的內容,但不會修改工做區的內容。
git rm filename : 刪除文件,以後用git commit指令提交刪除
git rm --cached FILE_NAME:從緩存區而不是從工做區刪除文件,一般用於誤提交
git remote add origin git@server-name:path/repo-name.git : 添加遠程倉庫URL
git push [-u] remoter-branch-name local-branch-name : 向遠程倉庫提交代碼,在第一次提交時須要加上-u指令
git clone git@server-name:path/repo-name.git : 將遠程的庫拷貝至當前的目錄下
git checkout -b branchname : 建立分支並切換進入分支
git branch branchname : 建立分支
git checkout branchname : 進入分支
git branch : 查看當前全部的分支,其中當前所在的分支名前會有*號標記
git branch -r : 查看遠程分支
git merge [--no-ff] [-m comment] branchname : 將名爲branchname的分支合併到當前的分支上,默認狀況下采用fast-forward的形式合併分支,可使用--no-ff取消該模式,保證日誌能夠記錄每一次合併,從而不丟失分支信息。-m能夠爲合併添加備註
git merge --abort : 放棄當前的合併
git branch -d branchname : 將名爲branchname的分支刪除
git branch -D branchname : 將名爲branchname的分支強制刪除,由於若分支中的信息沒有提交會沒法刪除,此時可使用強制刪除
git stash[@{n}] : 將工做現場以及緩存區中的內容「儲藏」起來,等之後恢復現場後繼續工做。能夠屢次stash,能夠經過指定n說明使用第n次存儲的內容
git stash --keep-index: 不要儲藏任何你經過 git add 命令已暫存的東西
git stash [--include-untracked|-u]: 默認狀況下,git stash 只會儲藏已經在索引中的文件。 若是指定 --include-untracked 或 -u 標記,Git 也會儲藏任何建立的未跟蹤文件。
git stash --patch : Git 不會儲藏全部修改過的任何東西,可是會交互式地提示哪些改動想要儲藏、哪些改動須要保存在工做目錄中
git stash branch <BRANCH NAME> :
git stash list : 查看存儲的工做現場
git stash apply [stashId] : 恢復現場可是不清除stash的內容,默認爲最近一次stash內容
git stash drop : 刪除stash內容
git stash pop : 恢復現場的同事清除stash內容
git remote [-v] : 查看遠程倉庫的信息
git remote add <shortname> <url>: 添加一個新的地址爲url的倉庫而且取名爲shortname
git remote show [remote-name]:查看遠程倉庫的狀態
git remote rename <ORIGIN_NAME> <NEW_NAME>:遠程倉庫的重命名
git remote rm <REMOTE-NAME> : 刪除遠程倉庫在本地的引用
git checkout -b localbranchname origin/remotebranch : 默認狀況下,clone下來後只能看到遠程master分支,若想在遠程的其它分支上工做,就必須建立和遠程分支對應的分支
git pull [remote] [branch] : 把最新的提交從遠程分支抓下來,而且直接和當前的分支進行合併
git fetch [remote-url|remote-branch-name]:將遠程倉庫的數據拉取到本地倉庫,可是不會合並或修改當前的工做
git branch --set-upstream localbranchname origin/remotebranchname : 建立本地分支和遠程分支的連接關係
git branch -v : 查看每個分支的最後一次提交
git branch [--merged|--no-merged] : 過濾列表中已經合併和還沒有合併到當前分支的分支
git push origin branch-name : 向遠程分支提交更新
git tag -a tagname [-m comment] [commitid] : 將當前的分支打上標籤,默認是最近一次提交,也能夠指定某次提交打上標籤
git tag : 查看全部標籤
git show tagname : 查看標籤的詳細信息
git tag -d tagname : 刪除某個標籤
git push origin tagname : 將標籤推送到遠程服務器
git push origin --tags : 一次性推送全部還未推送的標籤
git tag -d tagname + git push origin :refs/tags/tagname : 刪除遠程的標籤
git config --global alias.<SHORT_NAME> <COMPLETE_NAME>:將COMPLETE_NAME的指令換成等價的縮寫SHORT_NAME指令
git clean : 從工做目錄中移除未被追蹤的文件, 最好先運行 git stash --all
git grep -n [--count] <INFO> : 從提交歷史或者工做目錄中查找一個字符串或者正則表達式, -n是指Git所找到的匹配行號, --count使 Git 輸出概述的信息,僅僅包括哪些文件包含匹配以及每一個文件包含了多少個匹配, -p看匹配的行是屬於哪個方法或者函數, --and 標誌來查看複雜的字符串組合

場景舉例

初次安裝GIT後對git進行配置

git的配置文件位於三個目錄下,它們分別對應着不一樣的做用域,能夠經過git config進行操做程序員

1. /etc/gitconfig : 包含系統上每個用戶及他們倉庫的通用配置。 若是使用帶有 --system 選項的 git config 時,它會今後文件讀寫配置變量
2. ~/.gitconfig 或 ~/.config/git/config: 只針對當前用戶。能夠傳遞 --global 選項讓 Git 讀寫此文件
3. .git/config: 當前倉庫中的config文件,其配置針對當前倉庫。

這三個文件下一個級別覆蓋上一個級別的內容。也就是說本地的覆蓋用戶的,用戶的覆蓋全局的。github

在第一次安裝完畢後, 應當適當的配置git的信息面試

git config --global user.name "NAME"
git config --global user.email "EMAIL"
git config --list 列出全部Git當時能找到的所有配置
git config KEY 查找鍵爲KEY的配置文件信息,好比 git config user.name

這些global屬性會做用於當前系統該用戶全部的操做。若是想要對特定的倉庫採用不一樣的屬性,應當在那個倉庫目錄下使用沒有--global標籤的命令正則表達式

利用github新建一個遠程倉庫

在最開始的時候須要新建一個git項目並在遠程github上同步從而實現項目的共同開發。基本流程就是先在遠程倉庫上新建一個項目,而後將本地的項目和遠程鏈接。shell

首先簡單講一下在github上新建項目
1.新建倉庫
clipboard.pngsegmentfault

2.初始化倉庫,記住不要在倉庫中添加任何內容包括readme文件
clipboard.png緩存

3.建立完成後得到倉庫的URL,能夠一鍵複製安全

至此遠程的倉庫就建立完成了。而後咱們須要在本地新建一個項目來初始化這個遠程倉庫。假設我如今在本地有一個項目,項目的名稱爲TestGit服務器

1. cd DIR_OF_TESTGIT/TestGit :進入項目目錄
2. git init : 新建一個倉庫,這時的倉庫爲空。這時若是用 git branch指令會看到當前目錄下不存在任何分支
3. git remote add origin YOUR_URL : 將剛纔複製的倉庫的URL添加到本地並命名爲origin
4. git add * :將當前項目中的全部文件添加到緩存中
5. git commit -m 'init':將項目提交到本地倉庫而且備註爲init。在第一次提交以後git會自動初始化一個master分支。這是用 git branch指令查看會看到master分支
6. git push --set-upstream origin master:將master分支提交到遠程origin上,這裏--set-upstream實際上就是聲明當前項目的遠程url

至此你的本地項目和遠程項目就實現了初始化的同步

Fork操做

每每存在這麼一種狀況,當我在github上看到一個優秀的開源項目,我想將它‘拷貝’到本身的github下,而且在該項目上進行本身的更新,這種操做叫作Fork。網上有許多很優秀的文章講解了如何進行Fork操做,這裏我整理一下指令:

1. git remote -v : 查看當前的遠程倉庫中是否記錄了原做者的倉庫,若是沒有則進入1.1步進行添加
1.1 git remote add upstream origin-author-git-address: 將原做者的git地址添加到本地遠程倉庫中,該倉庫名爲upstream,固然也能夠取名爲別的
2 git fetch upstream : 將做者倉庫中的代碼獲取至本地倉庫
3 git checkout branchname : 切換到想要合併的分支上去
4 git merge upstream/master : 將遠程倉庫的master分支和當前的分支合併,也能夠遠程的其餘分支
5 git add filename + git commit -m 'comment' : 將本地的修改提交至本地的倉庫
6 git push : 將本地倉庫提交到本身的遠程倉庫
7 若是但願原做者能夠查看本身的修改,能夠向原做者發出pull request請求,原做者會試狀況將你的更新合併到他本身的代碼庫中

本地更改代碼後分支提交和合並操做

在不少狀況下,一旦出現代碼須要更改的狀況,咱們每每會在master分支上獨立開一個分支來進行開發,防止由於更改形成master上代碼的崩潰。建立分支編寫後再合併到master的操做以下:

1 git branch branchname : 新建分支
2 git checkout branchname : 切換到新建的分支中去。至此能夠進行相應的獨立開發,且不會影響master
3 git add filename : 將文件添加到緩存中
4 git commit -m COMMENT : 將緩存中的文件添加到倉庫中
5 git push : 將倉庫中更新的代碼添加到遠程倉庫上,而後在gitlab上提出merge請求

若是這時候master上代碼發生變化,那麼你當前所在的分支的master代碼就和當前master版本不一樣,須要你先更新當前分支的master部分的代碼,而後再將合併完成之後的代碼提交到遠程倉庫。這裏要記住,必定要先保存本地在workspace的修改。否則一旦合併,本地的內容就被抹去了。此時的操做以下:

1 git fetch origin master : 將master代碼更新到當前分支的倉庫中
2 git merge origin master : 將master代碼和本地的分支合併,而且修改衝突的部分
3 git push : 若是有衝突,則仍是須要經過add和commit操做提交到本地長褲,而後本地倉庫中的代碼push到遠程倉庫。
在和遠程倉庫達成一致後,再向master發送merge請求

配置gitignore

當咱們想要對代碼進行配置管理的時候,咱們有時候並不但願一些文件被上傳。例如,在IDEA編輯器中開發項目時,每每項目中會有IDEA本身的配置文件,通常存放在.idea文件夾中。當項目上傳時,咱們可能並不但願將這些文件也上傳,所以咱們須要配置.gitignore文件來聲明不須要提交的文件。

cat .gitignore 進入根目錄下而且建立.gitignore文件

在其中裏面添加但願屏蔽的文件,文件名稱能夠按照glob 模式匹配
文件 .gitignore 的格式規範以下:

  • 全部空行或者以 # 開頭的行都會被 Git 忽略。
  • 可使用標準的 glob 模式匹配。
  • 匹配模式能夠以(/)開頭防止遞歸。
  • 匹配模式能夠以(/)結尾指定目錄。
  • 要忽略指定模式之外的文件或目錄,能夠在模式前加上驚歎號(!)取反。

glob 模式是指 shell 所使用的簡化了的正則表達式。
星號(*)匹配零個或多個任意字符;
[abc] 匹配任何一個列在方括號中的字符(這個例子要麼匹配一個 a,要麼匹配一個 b,要麼匹配一個 c);
問號(?)只匹配一個任意字符;
若是在方括號中使用短劃線分隔兩個字符,表示全部在這兩個字符範圍內的均可以匹配(好比 [0-9] 表示匹配全部 0 到 9 的數字)。
使用兩個星號(*) 表示匹配任意中間目錄,好比a/**/z 能夠匹配 a/z, a/b/z 或 a/b/c/z等。

在這裏能夠參考個人正則表達式的文章

RESET VS CHECKOUT

GIT回退是一門大學問,在沒有完全理解GIT的工做區域和工做流程以前,很難透徹的明白如何對GIT倉庫進行回退。然而回退在使用GIT的過程當中是一個很重要的功能。因此咱們必須靜下心來,理解這個流程。

這個教程對回退講解的很是透徹,建議筆者先看兩遍這篇文章,理解後再使用下文中整理的具體指令。

git reset --soft <COMMIT_ID> : 將HEAD指向的分支移動指向COMMIT_ID的提交
git reset --soft HEAD~ : 將HEAD指向的分支指向HEAD的父提交,本質上是撤銷了上一次的COMMIT
git reset --mixed <COMMIT_ID> : 在指向COMMIT_ID提交的基礎上更新INDEX區(緩存區)的內容
git reset --hard <COMMIT_ID> : 在mixed的基礎上更新了工做區(workspace)的內容。這個操做很危險,由於它會直接覆蓋工做區的內容。
git reset [--mixed|--hard|--soft] <COMMIT_ID> <FILE_NAME|DIR_NAME>: 若是在reset指令中填寫了文件名或者路徑名,reset會跳過移動HEAD指向的指針的步驟,直接將FILE_NAME或DIR_NAME更新爲COMMIT_ID提交中的樣子,至於更新的區域則由mixed或是hard或是soft決定。COMMIT_ID在不填寫的狀況下默認爲HEAD。
git checkout [COMMIT_ID] : 與運行 git reset --hard [branch]很類似,它會更新全部三棵樹使其看起來像 [COMMIT_ID],不過有兩點重要的區別。 首先不一樣於 reset --hardcheckout對工做目錄是安全的,它會經過檢查來確保不會將已更改的文件弄丟。 其實它還更聰明一些。它會在工做目錄中先試着簡單合併一下,這樣全部還未修改過的文件都會被更新。 而 reset --hard則會不作檢查就全面地替換全部東西。 第二個重要的區別是如何更新 HEAD。 reset 會移動 HEAD 分支的指向,而 checkout 只會移動 HEAD 自身來指向另外一個分支。因此checkout指令能夠用來切換分支
git checkout [COMMIT_ID] [filename] : 相似於 git reset --hard [branch] file,該操做不安全

其它的場景等後續使用的時候繼續更新!

學習資料

Git Pro

clipboard.png
想要了解更多開發技術,面試教程以及互聯網公司內推,歡迎關注個人微信公衆號!將會不按期的發放福利哦~

相關文章
相關標籤/搜索