Git - 分布式版本控制系統

狀態

Git 有三種狀態,你的文件可能處 于其中之一:已提交(committed)、已修改(modified)和已暫存(staged)。 已提交表示數據已經安全的 保存在本地數據庫中。 已修改表示修改了文件,但還沒保存到數據庫中。 已暫存表示對一個已修改文件的當前 版本做了標記,使之包含在下次提交的快照中。

tapd_22285581_1558941076_42.png

由此引入 Git 項目的三個工作區域的概念:Git 倉庫、工作目錄以及暫存區域。
基本的 Git 工作流程如下:

  1. 在工作目錄中修改文件。
  2. 暫存文件,將文件的快照放入暫存區域。
  3. 提交更新,找到暫存區域的文件,將快照永久性存儲到 Git 倉庫目錄。

你工作目錄下的每一個文件都不外乎這兩種狀態:已跟蹤或未跟蹤。 已跟蹤的文件是指那些被納入了 版本控制的文件,在上一次快照中有它們的記錄,在工作一段時間后,它們的狀態可能處于未修改,已修改或已 放入暫存區。 工作目錄中除已跟蹤文件以外的所有其它文件都屬于未跟蹤文件,它們既不存在于上次快照的記 錄中,也沒有放入暫存區。

tapd_22285581_1558942318_8.png

版本回退

HEAD是一個特別指針,它指向你正在工作中的本地分支的指針,可以將 HEAD 想象為當前分支的別名。

#^代表第一父提交,命令回退到HEAD的第一父提交也就是上一版本,--hard會將所有狀態的文件同樣回退到上一個版本的狀態
git reset --hard HEAD^
#回退到指定commit_id的版本,commit_id是用SHA1計算出來的一長串數字,只寫前幾位數字github也能找到相關版本
git reset --hard <commit_id>

查看日志

git log

git log --pretty=oneline

查看區別

git diff HEAD -- <file>

git show命令

git show 

撤銷修改

#將暫存區的修改撤銷重新放回工作區,可以看到reset命令既可以回退版本,也可以撤銷修改
git reset HEAD <file>
#將文件在工作區的修改全部撤銷,就是讓這個文件回到最近一次git commit或git add時的狀態。這個命令中的--很重要,如果去掉--就變成了切換分支的命令
git checkout -- <file>

刪除文件

#相當于手動刪除文件,然后add添加到暫存區
git rm <file>
#刪錯了要恢復
git reset HEAD <file>
git checkout -- <file>

創建分支

#-b參數表示創建并切換
git checkout -b <branch_name>
#相當于
git branch dev
git checkout dev

查看當前分支

#列出所有分支,當前分支前面會標一個 * 號
git branch

合并分支

git merge <要合并的分支名稱>
#解決合并沖突,git status查看不能合并的文件,打開文件github會在沖突的地方做出標記,然后我們只需要手動編輯要保留的內容,然后提交文件

刪除本地和遠程分支

#刪除本地
git branch -d <branch_name>
#刪除遠程
git push origin --delete <branch_name>

儲藏工作

#儲藏之后再git status 就會出現nothing to commit, working tree clean,可以多次stash
git stash
#儲藏的工作列表
git stash list

恢復儲藏工作

#用stash apply恢復,但是恢復后,stash內容并不刪除,你需要用stash drop來刪除;
git stash apply
git stash drop
#stash pop恢復的同時把stash內容也刪了
git stash pop
#恢復刪除指定的stash,用stash list查看列表選中一個恢復,其中最近一次stash的num值最大,最早的num值為0,刪除一個stash后num值全部減一。
git stash apply stash@{<num>}
git stash drop stash@{<num>}

刪除未合并的分支

#將小d改為大D就可以了
git branch -D <branch_name>

查看遠程庫的信息

git remote
#查看更詳細的信息,顯示抓取(fetch)和推送(push)的遠程信息,如果沒有推送權限則不顯示push的遠程信息
git remote -v

推送分支

git push origin <branch_name>

抓取分支

#抓取過程中如果有沖突要先解決沖突
git pull

本地創建和遠程分支對應的分支

git checkout -b <branch_name> origin/<branch_name>

建立本地分支和遠程分支的關聯

git branch --set-upstream branch-name origin/branch-name

將提交歷史整理成直線

#存在風險,可完整閱讀官方文檔加深理解
git rebase

創建標簽

#在最近一次的commit上創建標簽
git tag <tag_name>
#在指定的commit上創建標簽
git tag <tag_name> <commit_id>
#創建帶有說明的標簽
git tag -a <tag_name> -m <text> <commit_id>
#查看標簽,按字母排序,而不是按時間排序
git tag
#查看標簽信息
git show <tag_name>

操作標簽

#刪除標簽
git tag -d <tag_name>
#推送單個標簽到遠程
git push origin <tag_name>
#一次性推送所有尚未推送到遠程的本地標簽
git push origin --tag
#刪除已經推送到遠程的標簽,冒號代表刪除
git tag -d <tag_name>
git push origin :refs/tags/<tag_name>

忽略特殊文件

Git工作區的根目錄下創建一個特殊的.gitignore文件,然后把要忽略的文件名填進去,Git就會自動忽略這些文件。
官方配置文件模版,使用時可根據實際情況組合一下。
如果某次需要添加被忽略的文件到Git

git add -f App.class

如果發現某個不應該被忽略的文件被忽略了

git check-ignore -v App.class

Git會告訴我們,.gitignore的第幾行規則忽略了該文件。

配置別名

git config --global alias.st status
git config --global alias.co checkout
git config --global alias.ci commit
git config --global alias.br branch
git config --global alias.unstage 'reset HEAD'
git config --global alias.last 'log -1'

刪除別名

#查看配置文件
vim .git/config
#將[alias]下面對應要刪除的別名那一行刪掉
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容