- 忽略某些文件 * 創(chuàng)建,刪除分支 * 找到最后修改某行代碼的人 * commit 后發(fā)現(xiàn)里邊包含一個不應該提交的文件 * commit 后發(fā)現(xiàn)少提交了一些文件 * 一個文件中的多次有改動,怎么做到只提交其中的一部分? * 怎樣整理提交記錄使其更加整潔? * 快速定位是哪一次提交引入了 bug * ...
2.第二關 設置git name and email
git config --global user.email "bob@example.com"
3.git clone到指定文件夾
git clone <git.repositoryURL> <文件夾名字>
4.git 忽略指定文件
echo "文件名" > .gitignore #每次只能保證一個文件被忽略,因為下次調(diào)用時,.gitignore文件被重寫了
5.忽略一系列文件
vim .gitignore
.a #代表所有以.a結(jié)尾的文件都會被忽略
!lib.a #除了lib.a
/ #所有文件及目錄都被忽略
!/foo #除了foo目錄
/foo/* #foo目錄下的所有文件及目錄都被忽略
!/foo/bar #除了foo/bar目錄
a//b #代表所有路徑,即是 如果有a/c/d/e/f/g/h/b這樣的路徑,那它被忽略了
6.git 記錄每次更新到倉庫
git status #可以查看當前倉庫中各個文件的狀態(tài)

git 倉庫中文件有以下4種狀態(tài):
1)untraced
- unmodified
- modified
-
staged
有時你嫌git status 輸出很臃腫,也可以使用git status --short / git status -s輸出精簡模式:
狀態(tài)簡覽
?? 新添加的未跟蹤文件前面有??標記
A 新添加到暫存區(qū)中的文件前面有A標記
M 修改過的文件前面有M標記
有時文件的標記位置會出現(xiàn)兩個MM##
M 出現(xiàn)在左邊的表示該文件被修改了,并將修改后的文件放到了暫存區(qū)
M 出現(xiàn)在右邊的表示該文件被修改了,但是還沒有放到暫存區(qū)
MM 表示文件在工作區(qū)被修改了并且放到了暫存區(qū),但是又在工作區(qū)被修改了,所以在暫存區(qū)和工作區(qū)都有該文件被修改的記錄
7.僅從git倉庫中刪除指定文件,而保留其在working tree中
git rm --cached <文件名> # 僅從git倉庫中刪除<文件名>而在working tree中保留
8.有時你在工作區(qū)做了一些工作,但是沒有做完,這時你需要切換到別的分支進行工作,而你又不想把這些半成品作為一次commit進行提交,這時你只是需要做git stash命令,將當前不想commit的文件暫時保存
這個命令貌似挺強大~以觀后效 https://git-scm.com/book/zh/v2/Git-%E5%B7%A5%E5%85%B7-%E5%82%A8%E8%97%8F%E4%B8%8E%E6%B8%85%E7%90%86#從儲藏創(chuàng)建一個分支
9.git tag 命令盲點
git 有兩種標簽,輕量標簽和附注標簽
1)輕量標簽---像一個不會改變的分支,只是特定提交的引用
2)附注標簽---是存儲在git數(shù)據(jù)庫中的完整對象,是可以被檢驗的,其中包含打標簽者的名字、email、日期時間等信息
在git中創(chuàng)建附注標簽很簡單:

git show 命令可以幫助你查看對應標簽提交信息:

后期打標簽

假設想給上面的hash Id打標簽:9fceb02
git tag -a v1.2 9fceb02
共享標簽
默認狀態(tài)下,git push 命令并不會傳送標簽到遠程服務器上,必須顯示提交,服務器端才會顯示,提交分為兩種方式,每次只提交一個,每次提交多個:


檢出標簽
git checkout -b <branchname> <tagname>
10.git commit
- git commit --date='@@@@@@@' -m "@@@@@@@"
可以用來指定commit 動作的提交時間 - git commit --amend
用來修改并替換上一次commit,也可以理解為在上次的基礎上追加
11.git reset
git 三棵樹
HEAD / index / working Directory
HEAD 為當前分支引用的指針,它總是指向該分支的最后一次提交,這表示HEAD將是下一次提交的父節(jié)點。簡單理解,HEAD就是你上一次的提交的快照。
index 是你預期的下一次提交,index 從理解上,你可以把它認為是Git的"暫存區(qū)域"
working Directory 字面意思就是你操作的工作目錄,你所有的git repository目錄下的內(nèi)容都在這個工作區(qū),而另外兩棵樹以一種高效但不直觀的方式存儲在.git文件夾中。
git 工作流程
git 主要的目的是通過操縱這三棵樹并記錄各自的狀態(tài)來管理整個項目:
git 工作流程圖
假設通過git init初始化一個git 項目后,我們的目錄下有個file.txt 這樣一個文件,并假定其當前版本為v1,下面通過分別執(zhí)行
- git add .
- git commit
- git reset
三條命令來講解git 是如何操作這三棵樹的.
git add
git add
git add 命令將處在wd目錄下的文件,復制到索引中
git commit
git commit
git commit 首先會移除index中的內(nèi)容,并將它保存為一個永久的快照,然后創(chuàng)建一個指向該快照的對象,最后更新master來指向本次提交
這時如果運行git status命令,會發(fā)現(xiàn)沒有任何log,因為三棵樹現(xiàn)在完全相同
如果這時我們修改了file.txt文件為v2版本,然后執(zhí)行git status命令,git log日志系統(tǒng)會提示『Changes not staged for commit』,提示你進行git add 操作
edit file.txt -> v2
執(zhí)行git add操作
git add操作
這時如果執(zhí)行git status來觀察變化,會有『Changes to be committed』這樣的提示,因為HEAD和index中的內(nèi)容不同。最后我們執(zhí)行git commit 來完成提交
git commit
至此三棵樹再次相同,都是file.txt v2版本
git reset
為了理解reset命令,假設我們修改了file.txt文件并第三次提交它,現(xiàn)在三棵樹如下所示:
![Upload Paste_Image.png failed. Please try again.]
有三種git reset 使用方式: - git reset --soft <版本號>
- git reset --mixed <版本號>
- git reset --hard <版本號>
git reset --soft <版本號>
通過--soft 選項,僅僅是改變了HEAD的指向,但是并不改變index和WD,這和改變HEAD自身不同(checkout所做的),這意味著如果HEAD設置為master分支,運行git reset 9e5e64a 將會使master 指向 9e5e64a 。無論你調(diào)用上面哪種形式的reset, git 都會嘗試改變HEAD的指向,只不過--soft選項保證了僅僅是改變了HEAD的指向,而不對index和wd進行修改!
git reset --soft HEAD~
綜上,理解上git reset --soft 可以理解為git commit 的反向操作
git reset --mixed <版本號>
按照講得順序,猜你已經(jīng)知道了,git reset --mixed 就是回滾到git commit 和 git add 之前,即保存wd中的修改,但是撤銷上次的add/commit對命令
git reset [--mixed] HEAD~git reset --hard
git reset --hard 是一個很危險的操作,除非你真的知道你在做什么,不然啥給你們兩條命令足夠滿足你的需求。假設現(xiàn)在三棵樹都在file.txt v3版本下,這時如果你執(zhí)行 git reset --hard 命令,則同時修改了HEAD / index / WD, 即整個三棵樹都回滾到上一次 修改/ add / commit 時的內(nèi)容
git reset --hard HEAD~
git reset 大招 --- 壓縮
通常我們在完成一個小需求時都會選擇add/commit一下,而由于整個需求沒有都完成,所以如果直接push就會顯得很沒有水平,那么如果能合并幾次commit為一次commit動作,就是壓縮一下,是不是就會很完美!
原理很簡單,先正常add/commit , 然后使用git reset --soft 來修改HEAD,最后在執(zhí)行一次commit,就完成了壓縮操作。
舉例說明:
設你有一個項目,第一次提交中有一個文件,第二次提交增加了一個新的文件并修改了第一個文件,第三次提交再次修改了第一個文件。 由于第二次提交是一個未完成的工作,因此你想要壓縮它:

然后執(zhí)行git reset --soft HEAD~2 來將HEAD分支移動到一個舊的提交上(即你想保留的提交)

然后執(zhí)行 git commit

12. git checkout
checkout 命令通常都用在了切換分支上,但是checkout 針對文件,它還有restore恢復,還原文件的功能:
git checkout -- <file>
origin : this is a initial file
modified : This is the initial config file
These are changed you don't want to keep!
這時如果使用checkout 命令就會還原修改modified -> origin版本!
當然你要記住,這是一條很危險的命令,因為git會用原來的文件覆蓋你修改的文件,而你又沒有對其進行提交,因此可以說還原是不可逆的操作,也就是說還原很簡單,但是再想恢復到修改后的狀態(tài)是不容易啦
13. 查看遠程倉庫
當使用git在本地開發(fā)時,如果你是通過git clone 命令拿到的項目的repository,那么git 則幫你建好了本地的倉庫,并命名為origin !
但有時你有疑問,想知道遠程服務器中還有哪些倉庫? 可以通過
git remote

如果你想知道更具體的信息,則執(zhí)行
git remote -v

已經(jīng)知道了有哪些倉庫,如果你想知道某一個倉庫的具體信息,可以執(zhí)行
git remote show <repository name>

如果獲得某一個倉庫中所有數(shù)據(jù),但又不想改變本地倉庫中的內(nèi)容(pull動作),可以執(zhí)行
git fetch <remote-name>

添加遠程倉庫:
git remote add <remote-name> <remote-url>
git remote add <remote-name> <remote-url>
參考:
https://git-scm.com/book/zh/v2/Git-%E5%B7%A5%E5%85%B7-%E9%87%8D%E7%BD%AE%E6%8F%AD%E5%AF%86










