自學(xué)總結(jié)的
創(chuàng)建一個版本庫非常簡單罕伯,首先啤它,選擇一個合適的地方,創(chuàng)建一個空目錄:
$ mkdir learngit
$ cd learngit
$ pwd
/Users/michael/learngit
pwd命令用于顯示當(dāng)前目錄
通過git init命令把這個目錄變成Git可以管理的倉庫:
$ git init
Initialized empty Git repository in /Users/michael/learngit/.git/
編寫一個 readme.txt
Git is a version control system.
Git is free software.
第一步骏全,用命令git add告訴Git裳仆,把文件添加到倉庫:
$ git add readme.txt
無反應(yīng)正常
第二步卸耘,用命令git commit告訴Git坦辟,把文件提交到倉庫:
$ git commit -m "wrote a readme file"
[master (root-commit) eaadf4e] wrote a readme file
1 file changed, 2 insertions(+)
create mode 100644 readme.txt
commit可以一次提交很多文件诅岩,所以你可以多次add不同的文件
小結(jié):
初始化一個Git倉庫沪曙,使用git init命令奕污。
添加文件到Git倉庫,分兩步:
使用命令git add <file>液走,注意碳默,可反復(fù)多次使用,添加多個文件缘眶;
使用命令git commit -m <message>嘱根,完成。
git status命令可以讓我們時刻掌握倉庫當(dāng)前的狀態(tài)
$ git status
On branch master
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: readme.txt
no changes added to commit (use "git add" and/or "git commit -a")
用git diff這個命令看看具體修改了什么
$ git diff readme.txt
diff --git a/readme.txt b/readme.txt
index 46d49bf..9247db6 100644
--- a/readme.txt
+++ b/readme.txt
@@ -1,2 +1,2 @@
-Git is a version control system.
+Git is a distributed version control system.
Git is free software.
小結(jié):
要隨時掌握工作區(qū)的狀態(tài)巷懈,使用git status命令该抒。
如果git status告訴你有文件被修改過,用git diff可以查看修改內(nèi)容顶燕。
git log命令顯示從最近到最遠(yuǎn)的提交日志
用git log命令查看已經(jīng)修改過的版本:
$ git log
commit 1094adb7b9b3807259d8cb349e7df1d4d6477073 (HEAD -> master)
Author: Michael Liao <askxuefeng@gmail.com>
Date: Fri May 18 21:06:15 2018 +0800
append GPL
commit e475afc93c209a690c39c13a46716e8fa000c366
Author: Michael Liao <askxuefeng@gmail.com>
Date: Fri May 18 21:03:36 2018 +0800
add distributed
commit eaadf4e385e865d25c48e7ca9c8395c3f7dfaef0
Author: Michael Liao <askxuefeng@gmail.com>
Date: Fri May 18 20:59:18 2018 +0800
wrote a readme file
如果輸出信息太多凑保,可以加上--pretty=oneline參數(shù):
$ git log --pretty=oneline
1094adb7b9b3807259d8cb349e7df1d4d6477073 (HEAD -> master) append GPL
e475afc93c209a690c39c13a46716e8fa000c366 add distributed
eaadf4e385e865d25c48e7ca9c8395c3f7dfaef0 wrote a readme file
一大串字符是版本號
在Git中,用HEAD表示當(dāng)前版本
要把當(dāng)前版本append GPL回退到上一個版本add distributed涌攻,就可以使用git reset命令:
$ git reset --hard HEAD^
HEAD is now at e475afc add distributed
查看當(dāng)前版本文件的具體內(nèi)容 回到之前的上一個版本了
$ cat readme.txt
Git is a distributed version control system.
Git is free software.
再次查看git log 最新的版本就消失了欧引,想要再回來,沒有關(guān)閉的情況下恳谎,可以利用ID,長度足夠分辨就可以
版本號沒必要寫全芝此,前幾位就可以了,Git會自動去找因痛。當(dāng)然也不能只寫前一兩位婚苹,因為Git可能會找到多個版本號,就無法確定是哪一個了
$ git reset --hard 1094a
HEAD is now at 83b0afe append GPL
如果時間長鸵膏,想要恢復(fù)膊升,命令git reflog用來記錄你的每一次命令查找ID:
$ git reflog
e475afc HEAD@{1}: reset: moving to HEAD^
1094adb (HEAD -> master) HEAD@{2}: commit: append GPL
e475afc HEAD@{3}: commit: add distributed
eaadf4e HEAD@{4}: commit (initial): wrote a readme file
小結(jié):
HEAD指向的版本就是當(dāng)前版本,因此谭企,Git允許我們在版本的歷史之間穿梭廓译,使用命令git reset --hard commit_id结胀。
穿梭前,用git log可以查看提交歷史责循,以便確定要回退到哪個版本。
要重返未來攀操,用git reflog查看命令歷史院仿,以便確定要回到未來的哪個版本。
暫存區(qū) 工作區(qū)
git commit只更新 已經(jīng)git add的版本
用git diff HEAD -- readme.txt命令可以查看工作區(qū)和版本庫里面最新版本的區(qū)別:(沒成功速和,沒反應(yīng))
git checkout -- file可以丟棄工作區(qū)的修改
$ git checkout -- readme.txt
用命令git reset HEAD <file>可以把暫存區(qū)的修改撤銷掉(unstage)歹垫,重新放回工作區(qū),再用工作區(qū)的命令清除:
$ git reset HEAD readme.txt
Unstaged changes after reset:
M readme.txt
小結(jié)
場景1:當(dāng)你改亂了工作區(qū)某個文件的內(nèi)容颠放,想直接丟棄工作區(qū)的修改時排惨,用命令git checkout -- file
。
場景2:當(dāng)你不但改亂了工作區(qū)某個文件的內(nèi)容碰凶,還添加到了暫存區(qū)時暮芭,想丟棄修改,分兩步欲低,第一步用命令git reset HEAD <file>
辕宏,就回到了場景1,第二步按場景1操作砾莱。
場景3:已經(jīng)提交了不合適的修改到版本庫時瑞筐,想要撤銷本次提交,參考版本回退一節(jié)腊瑟,不過前提是沒有推送到遠(yuǎn)程庫聚假。
rm 命令可以直接刪除文件
$ rm test.txt
再用git status命令會立刻告訴你哪些文件被刪除了:
$ git status
On branch master
Changes not staged for commit:
(use "git add/rm <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
deleted: test.txt
no changes added to commit (use "git add" and/or "git commit -a")
現(xiàn)在有兩種選擇
1.確實要從版本庫中刪除該文件,那就用命令git rm刪掉闰非,并且git commit:
$ git rm test.txt
rm 'test.txt'
$ git commit -m "remove test.txt"
[master d46f35e] remove test.txt
1 file changed, 1 deletion(-)
delete mode 100644 test.txt
2.另一種情況是刪錯了膘格,因為版本庫里還有呢,所以可以很輕松地把誤刪的文件恢復(fù)到最新版本:
$ git checkout -- test.txt
git checkout其實是用版本庫里的版本替換工作區(qū)的版本河胎,無論工作區(qū)是修改還是刪除闯袒,都可以“一鍵還原”。
小結(jié)
命令git rm用于刪除一個文件游岳。如果一個文件已經(jīng)被提交到版本庫政敢,那么你永遠(yuǎn)不用擔(dān)心誤刪,但是要小心胚迫,你只能恢復(fù)文件到最新版本喷户,你會丟失最近一次提交后你修改的內(nèi)容。
創(chuàng)建Github賬號 新倉庫访锻,加入秘鑰 連接本地電腦
連接本地庫命令
$ git remote add origin https://github.com/15922/learngit.git
本地庫內(nèi)容推送遠(yuǎn)程
$ git push -u origin master
由于遠(yuǎn)程庫是空的褪尝,我們第一次推送master分支時闹获,加上了-u參數(shù),Git不但會把本地的master分支內(nèi)容推送的遠(yuǎn)程新的master分支河哑,還會把本地的master分支和遠(yuǎn)程的master分支關(guān)聯(lián)起來避诽,在以后的推送或者拉取時就可以簡化命令。
從現(xiàn)在起璃谨,只要本地作了提交沙庐,就可以通過命令:
$ git push origin master
把本地master分支的最新修改推送至GitHub,
小結(jié)
要關(guān)聯(lián)一個遠(yuǎn)程庫佳吞,使用命令git remote add origin git@server-name:path/repo-name.git拱雏;
關(guān)聯(lián)后,使用命令git push -u origin master第一次推送master分支的所有內(nèi)容底扳;
此后铸抑,每次本地提交后,只要有必要衷模,就可以使用命令git push origin master推送最新修改鹊汛;
克隆庫
登陸GitHub,創(chuàng)建一個新的倉庫算芯,名字叫g(shù)itskills:
勾選Initialize this repository with a README柒昏,這樣GitHub會自動為我們創(chuàng)建一個README.md文件。創(chuàng)建完畢后熙揍,可以看到README.md文件:
用命令git clone克隆一個本地庫:
$ git clone git@github.com:15922/gitskills.git
Cloning into 'gitskills'...
The authenticity of host 'github.com (192.30.253.113)' can't be established.
RSA key fingerprint is SHA256:nThbg6kXUpJWGl7E1IGOCspRomTxdCARLviKw6E5SY8.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'github.com,192.30.253.113' (RSA) to the list of known hosts.
remote: Enumerating objects: 3, done.
remote: Counting objects: 100% (3/3), done.
remote: Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
Receiving objects: 100% (3/3), done.
查看目錄职祷,查看文件列表
$ cd gitskills
$ ls
README.md
小結(jié)
要克隆一個倉庫,首先必須知道倉庫的地址届囚,然后使用git clone命令克隆有梆。
Git支持多種協(xié)議,包括https意系,但通過ssh支持的原生git協(xié)議速度最快泥耀。
創(chuàng)建合并分支
創(chuàng)建dev分支,然后切換到dev分支:
$ git checkout -b dev
Switched to a new branch 'dev'
git checkout命令加上-b參數(shù)表示創(chuàng)建并切換蛔添,相當(dāng)于以下兩條命令:
$ git branch dev
$ git checkout dev
Switched to branch 'dev'
然后痰催,用git branch命令查看當(dāng)前分支:
$ git branch
* dev
master
把dev分支的工作成果合并到master分支上:
$ git merge dev
Updating d46f35e..b17d20e
Fast-forward
readme.txt | 1 +
1 file changed, 1 insertion(+)
合并完成后,就可以放心地刪除dev分支了:
$ git branch -d dev
Deleted branch dev (was b17d20e).
小結(jié)
查看分支:git branch
創(chuàng)建分支:git branch <name>
切換分支:git checkout <name>
創(chuàng)建+切換分支:git checkout -b <name>
合并某分支到當(dāng)前分支:git merge <name>
刪除分支:git branch -d <name>
小結(jié)
當(dāng)Git無法自動合并分支時迎瞧,就必須首先解決沖突夸溶。解決沖突后,再提交凶硅,合并完成缝裁。
解決沖突就是把Git合并失敗的文件手動編輯為我們希望的內(nèi)容,再提交足绅。
用git log --graph命令可以看到分支合并圖捷绑。
小結(jié)
合并分支時韩脑,加上--no-ff參數(shù)就可以用普通模式合并,合并后的歷史有分支粹污,能看出來曾經(jīng)做過合并段多,而fast forward合并就看不出來曾經(jīng)做過合并。
當(dāng)手頭工作沒有完成時壮吩,先把工作現(xiàn)場git stash一下衩匣,然后去修復(fù)bug,修復(fù)后粥航,再git stash pop,回到工作現(xiàn)場生百。
你可以多次stash递雀,恢復(fù)的時候,先用git stash list查看蚀浆,然后恢復(fù)指定的stash缀程,用命令:
$ git stash apply stash@{0}
添加一個新功能時,你肯定不希望因為一些實驗性質(zhì)的代碼市俊,把主分支搞亂了杨凑,所以,每添加一個新功能摆昧,最好新建一個feature分支撩满,在上面開發(fā),完成后绅你,合并伺帘,最后,刪除該feature分支忌锯。
小結(jié)
開發(fā)一個新feature伪嫁,最好新建一個分支;
如果要丟棄一個沒有被合并過的分支偶垮,可以通過git branch -D <name>強行刪除张咳。
查看遠(yuǎn)程庫的信息,用git remote:
$ git remote
origin
小結(jié)
用git remote -v顯示更詳細(xì)的信息:
查看遠(yuǎn)程庫信息似舵,使用git remote -v脚猾;
本地新建的分支如果不推送到遠(yuǎn)程,對其他人就是不可見的啄枕;
從本地推送分支婚陪,使用git push origin branch-name,如果推送失敗频祝,先用git pull抓取遠(yuǎn)程的新提交泌参;
在本地創(chuàng)建和遠(yuǎn)程分支對應(yīng)的分支脆淹,使用git checkout -b branch-name origin/branch-name,本地和遠(yuǎn)程分支的名稱最好一致沽一;
建立本地分支和遠(yuǎn)程分支的關(guān)聯(lián)盖溺,使用git branch --set-upstream branch-name origin/branch-name;
從遠(yuǎn)程抓取分支铣缠,使用git pull烘嘱,如果有沖突,要先處理沖突蝗蛙。
小結(jié)
rebase操作可以把本地未push的分叉提交歷史整理成直線蝇庭;
rebase的目的是使得我們在查看歷史提交的變化時更容易,因為分叉的提交需要三方對比捡硅。
小結(jié)
命令git tag <tagname>用于新建一個標(biāo)簽哮内,默認(rèn)為HEAD,也可以指定一個commit id壮韭;
命令(git tag -a <tagname> -m "blablabla..." 編號)可以指定標(biāo)簽信息北发;
命令git tag可以查看所有標(biāo)簽。
小結(jié)
命令git push origin <tagname>可以推送一個本地標(biāo)簽喷屋;
命令git push origin --tags可以推送全部未推送過的本地標(biāo)簽琳拨;
命令git tag -d <tagname>可以刪除一個本地標(biāo)簽;
命令git push origin :refs/tags/<tagname>可以刪除一個遠(yuǎn)程標(biāo)簽屯曹。
小結(jié)
忽略某些文件時狱庇,需要編寫.gitignore;
.gitignore文件本身要放到版本庫里恶耽,并且可以對.gitignore做版本管理僵井!