創建版本庫
1.創建目錄mkdir learngit
,進入cd learngit
2.將目錄變成Git可以管理的倉庫git init
,此時Git倉庫就建好了,可以通過ls -ah
來查看常用的git命令及解釋
1.git init
初始化Git管理倉庫
2.git add file
文件添加到倉庫
3.git commit -m "添加的注釋"
提交
4.git status
查看add之后未commit的文件
5.git diff
查看上一步的區別
6.git log --pretty=oneline
查看版本歷史,后面參數可以單行查看,顯示更加清晰
7.git reset --hard commit_id
版本回退
8.git checkout -- readme.txt
把readme.txt文件在工作區的修改全部撤銷,就是讓這個文件回到最近一次git commit
或git add
時的狀態。例如:當你改亂了工作區某個文件的內容,想直接丟棄工作區的修改時,用命令git checkout -- file
。或者當你不但改亂了工作區某個文件的內容,還添加到了暫存區時,想丟棄修改,先git reset HEAD file
,就回到了場景1,第二步按場景1操作。
9.git rm test.txt
并且git commit
刪除。
10.git remote add origin git@github.com:michaelliao/learngit.git
添加遠程倉庫。
11.git push -u origin master
把本地庫的內容推送到遠程,
由于遠程庫是空的,我們第一次推送master分支時,加上了-u
參數,Git不但會把本地的master
分支內容推送的遠程新的master
分支,還會把本地的master
分支和遠程的master
分支關聯起來,在以后的推送或者拉取時就可以簡化命令。推送成功后遠程與本地的庫應該是一樣的。
12.git push origin master
本地提交之后就可以遠程推送。
13.git clone git@github.com:michaelliao/gitskills.git
從遠程庫克隆,首先遠程庫創建倉庫gitskills
。
14.git checkout -b dev
創建并切換分支相當于git branch dev
與git checkout dev
。
15.git branch
查看分支情況,當前分支有星號。
16.git merge
合并指定分支到當前分支,當Git無法自動合并分支時,就必須首先解決沖突。解決沖突后,再提交,合并完成。git status
可以查看沖突情況
17.git branch -d dev
刪除分支。
18.git checkout name
切換分支。
19.git log --graph --pretty=oneline --abbrev-commit
查看分支情況。
20.git merge --no-ff -m "merge with no-ff" dev
不使用Fast forward合并模式,因為本次合并要創建一個新的commit,所以加上-m
參數,把commit描述寫進去
21.git stash
將當前的工作現場儲存起來等以后恢復現場繼續工作。
場景:當你接到一個修復一個代號101的bug的任務時,很自然地,你想創建一個分支issue-101來修復它,但是,等等,當前正在dev上進行的工作還沒有提交,并不是你不想提交,而是工作只進行到一半,還沒法提交,預計完成還需1天時間。但是,必須在兩個小時內修復該bug,怎么辦?
a、git stash
暫存。
b、git status
確認工作區是干凈的。
c、決定在master分支上解決git branch master
d、git checkout -b issu-101
創建臨時分支
e、修復bug,然后提交文件git add file..
f、修復完成后,切換到master分支,合并,刪除issu-101分支
g、回到dev分支繼續干活git checkout dev
h、git stash list
查看暫存
i、git stash apply
恢復,但是恢復后,stash內容并不刪除
j、git stash drop
刪除
k、git stash pop
恢復并刪除stash
22.git checkout -b feature-vulcan
軟件開發中,總有無窮無盡的新的功能要不斷添加進來。
添加一個新功能時,你肯定不希望因為一些實驗性質的代碼,把主分支搞亂了,所以,每添加一個新功能,最好新建一個feature分支,在上面開發,完成后,合并,最后,刪除該feature分支。
23.git branch -D <name>
強行刪除
24.git remote -v
查看遠程倉庫
25.git push origin branch-name
從本地推送分支
26.git pull
遠程抓取分支
27.git checkout -b branch-name origin/branch-name
在本地創建和遠程分支對應的分支
28.git branch --set-upstream branch-name origin/branch-name
建立本地分支和遠程分支的關聯
29.git tag v1.1
給當前分支的最新提交的commit上打一個標簽
30.git tag
查看所有標簽
31.git tag v0.9 6224937
給某個commit_id打上標簽
32.git show tagname
查看標簽信息
33.git tag -a v0.1 -m "version 0.1 released" 3628164
創建帶有說明的標簽,用-a
指定標簽名,-m
指定說明文字
34.git tag -s <tagname> -m "blablabla..."
可以用PGP簽名標簽;
35.git tag -d v0.1
刪除標簽
36.git push origin v1.0
推送某個標簽到遠程
37.git push origin --tags
一次性推送全部尚未推送到遠程的本地標簽
38.git tag -d v0.9
先從本地刪除
39.git push origin :refs/tags/v0.9
從遠程刪除
40.git config --global color.ui true
文件名就會標上顏色
41.git check-ignore
查找哪個規則寫錯了,忽略文件時需要添加.gitignore
文件,所有配置文件可以直接在線瀏覽:<a >傳送門</a>
42.git config --global alias.st status
配置別名,告訴Git,以后st就表示status
43.git config --global alias.unstage 'reset HEAD'
此時git unstage test.py
相當于git reset HEAD test.py
44.git config --global alias.lg "log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit"
git log估計會很爽...-
多人協作
a、可以試圖用git push origin branch-name
推送自己的修改;
b、如果推送失敗,則因為遠程分支比你的本地更新,需要先用git pull
試圖合并;
c、如果合并有沖突,則解決沖突,并在本地提交;
d、沒有沖突或者解決掉沖突后,再用git push origin branch-name
推送就能成功!如果git pull提示“no tracking information”,則說明本地分支和遠程分支的鏈接關系沒有創建,用命令
git branch --set-upstream branch-name origin/branch-name
。這就是多人協作的工作模式,一旦熟悉了,就非常簡單。 標簽
發布一個版本時,我們通常先在版本庫中打一個標簽(tag),這樣,
就唯一確定了打標簽時刻的版本。將來無論什么時候,取某個標簽的
版本,就是把那個打標簽的時刻的歷史版本取出來。所以,標簽也是
版本庫的一個快照。tag就是一個讓人容易記住的有意義的名字,它跟
某個commit綁在一起注意
1.git log
與git reflog
的區別:
前者回退版本之后,此版本之后的記錄就自動抹除了,而后者不會,可以查到所有的記錄。
2.git diff
與git diff --cache
的區別:
前者是是工作區(work dict)和暫存區(stage)的比較,而后者是暫存區(stage)和分支(master)的比較。
3.合并分支時,加上--no-ff
參數就可以用普通模式合并,合并后的歷史有分支,能看出來曾經做過合并,而fast forward合并就看不出來曾經做過合并。
4.忽略文件的原則是:
忽略操作系統自動生成的文件,比如縮略圖等;
忽略編譯生成的中間文件、可執行文件等,也就是如果一個文件是通 過另一個文件自動生成的,那自動生成的文件就沒必要放進版本庫,比 如Java編譯產生的.class文件;
忽略你自己的帶有敏感信息的配置文件,比如存放口令的配置文件。
5.配置Git的時候,加上--global是針對當前用戶起作用的,如果不加,那只針對當前的倉庫起作用。
a、每個倉庫的Git配置文件都放在.git/config文件中
b、當前用戶的Git配置文件放在用戶主目錄下的一個隱藏文件.gitconfig
-
概念
工作區:就是建立的文件夾倉庫learngit
版本庫:工作區的隱藏的.git文件夾
暫存區:版本庫里的最重要的部分,git add
添加的位置
分支:git自動為我們創建的為master,還有一個指向master的指針HEAD,git commit
提交的位置
如下圖:
工作區與緩存區
分布式VS集中式:</br>
分布式版本系統的最大好處之一是在本地工作完全不需要考慮遠程庫的存在,也就是有沒有聯網都可以正常工作,而SVN在沒有聯網的時候是拒絕干活的!當有網絡的時候,再把本地提交推送一下就完成了同步,真是太方便了!現在有了分支,就不用怕了。你創建了一個屬于你自己的分支,別人看不到,還繼續在原來的分支上正常工作,而你在自己的分支上干活,想提交就提交,直到開發完畢后,再一次性合并到原來的分支上,這樣,既安全,又不影響別人工作。