1.申請(qǐng) SSH Key
命令:
$ git config --global user.name "zhenglm"
$ git config --global user.email "578314999@qq.com"
$ ssh-keygen -t rsa -C "578314999@qq.com"
說(shuō)明:前兩個(gè)命令是 第一次打開(kāi) Git時(shí)垦写,對(duì)本地環(huán)境的配置
第三個(gè)命令是 生成 ssh的Key生成的 ssh key是兩個(gè)文件,在系統(tǒng)當(dāng)前用戶目錄(C:\Users\zhenglm)下的 .ssh 目錄下,其中 id_rsa.pub是公鑰放在github上,id_rsa是私鑰保留在本地就好。
因?yàn)镚itHub需要識(shí)別出你推送的提交確實(shí)是你推送的氯析,而不是別人冒充的
2.將遠(yuǎn)程倉(cāng)庫(kù)拷貝到本地
命令:
$ git clone git@github.com:zhangyaoyuan/PkuJava31.git
3.將剛才拷貝到本地的項(xiàng)目的分支check到本地
命令:
$ git checkout -b 1501211044
Switched to a new branch '1501211044'
說(shuō)明:將已經(jīng)存在的 1501211044 分支checkout到本地了,并切換到分支Git checkout 命令加上 -b參數(shù)表示創(chuàng)建并且切換莺褒,相當(dāng)于同時(shí)執(zhí)行了兩條命令
$ git branch 1501211044
$ git checkout 1501211044 --- 切換到 1501211044 分支
Switched to branch '1501211044'
在你切換到 1501211044 分支后魄鸦,你此時(shí)提交的文檔就相當(dāng)于提交到了當(dāng)前分支里面,在你將分支與主干(master)合并之前癣朗,并不會(huì)影響 master拾因。
4.查看當(dāng)前分支
可以讓我們時(shí)刻掌握倉(cāng)庫(kù)當(dāng)前的狀態(tài):
$ git branch
* 1501211044
Master
5.修改分支后提交分支
命令:
$ git add zlmtest.txt
$ git commit -m "branch test"
[1501211044 17d4022] branch test
1 file changed, 1 insertion(+)
create mode 100644 zlmtest.txt
第一條命令作用是把你新添加到分支的文件add到Git系統(tǒng)的索引庫(kù),第二條命令的作用是根據(jù)索引庫(kù)內(nèi)容提交(-m參數(shù)后跟的是提交時(shí)的說(shuō)明信息)旷余。如果你沒(méi)有把新添加的文件先add的話绢记,而是直接commit,那么會(huì)出現(xiàn)如下的提示:
Git add 命令的一點(diǎn)補(bǔ)充:
(1)git add <path> :表示將path中所有修改的和新添加的命令添加正卧,不包括刪除的文件蠢熄。
(2)git add -u [<path>] :表示將path中所有tracked(之前已經(jīng)添加過(guò))的修改過(guò)的和刪除的文件添加到索引庫(kù)。不包括新建的文件炉旷。
(3)git add -A [<path>] :表示將path中所有tracked文件中被修改和刪除的文件以及untracked文件信息添加到索引庫(kù)签孔。
(4)git add -i [<path>] :查看path中所有修改和已刪除的文件。
6窘行、將分支內(nèi)容合并到 master
命令: MINGW64 ~/PkuJava31 (master)
$ git merge 1501211044
說(shuō)明:git merge 命令的作用是合并某指定分支 到當(dāng)前分支饥追。所以如果要將1501211044分 支合并到 master必須要用 git checkout命令切換到 master分之后,再執(zhí)行 git merge 1501211044 命令罐盔。
此時(shí)在 GitHub上還看不到新的提交后的結(jié)果但绕,因?yàn)檫@只是對(duì)你本地副本的操作。
7惶看、將合并到master的修改結(jié)果推送的遠(yuǎn)程主機(jī)GitHub
命令: MINGW64 ~/PkuJava31 (master)
$ git push origin master
說(shuō)明:使用 git push命令將修改信息推送到遠(yuǎn)程主機(jī)捏顺,
格式:$ git push <遠(yuǎn)程主機(jī)名> <本地分支名>:<遠(yuǎn)程分支名>
遠(yuǎn)程主機(jī)名默認(rèn)為 origin ,<本地分支名>是你要push的本地分支的名稱纬黎,這里是master<遠(yuǎn)程分支名> 如果不填默認(rèn)為本地分支對(duì)應(yīng)的遠(yuǎn)程分支幅骄。
8.刪除分支
命令:MINGW64 ~/PkuJava31 (1501211044)
$ git branch -d 1501211044
1. 查看修改的內(nèi)容
第一天上班時(shí),已經(jīng)記不清上次怎么修改的readme.txt本今,所以拆座,需要用git diff這個(gè)命令看看:
$ 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.
2.commit
“保存一個(gè)快照”主巍,這個(gè)快照在Git中被稱為commit。一旦你把文件改亂了懂拾,或者誤刪了文件煤禽,還可以從最近的一個(gè)commit恢復(fù)铐达,然后繼續(xù)工作岖赋,而不是把幾個(gè)月的工作成果全部丟失。
3 . 顯示提交的歷史記錄
git log命令顯示從最近到最遠(yuǎn)的提交日志
如果嫌輸出信息太多瓮孙,看得眼花繚亂的唐断,可以試試加上--pretty=oneline
參數(shù):
$ git log --pretty=oneline
3628164fb26d48395383f8f31179f24e0882e1e0 append GPL
ea34578d5496d7dd233c827ed32a8cd576c5ee85 add distributed
cb926e7ea50ad11b8f9e909c05226233bf755030 wrote a readme file
**4.commit 版本的回溯
(1)回退到上一個(gè)版本
$ git reset --hard HEAD^
HEAD is now at ea34578 add distributed
(2)如果想在回去,需要版本的id號(hào)
$ git reset --hard 3628164
HEAD is now at 3628164 append GPL
(3)Git提供了一個(gè)命令git reflog
用來(lái)記錄你的每一次命令:
$ git reflog
ea34578 HEAD@{0}: reset: moving to HEAD^
3628164 HEAD@{1}: commit: append GPL
ea34578 HEAD@{2}: commit: add distributed
cb926e7 HEAD@{3}: commit (initial): wrote a readme file
**5.git的核心概念理解
1.工作區(qū)(Working Directory)
就是你在電腦里能看到的目錄
2.版本庫(kù)(Repository)
工作區(qū)有一個(gè)隱藏目錄.git
提交流程
第一步是用git add把文件添加進(jìn)去,實(shí)際上就是把文件修改添加到暫存區(qū)杭抠;
第二步是用git commit提交更改脸甘,實(shí)際上就是把暫存區(qū)的所有內(nèi)容提交到當(dāng)前分支。
因?yàn)槲覀儎?chuàng)建Git版本庫(kù)時(shí)偏灿,Git自動(dòng)為我們創(chuàng)建了唯一一個(gè)master分支丹诀,所以,現(xiàn)在翁垂,git commit就是往master分支上提交更改铆遭。
例子
先對(duì)readme.txt做個(gè)修改,比如加上一行內(nèi)容:
Git is a distributed version control system.
Git is free software distributed under the GPL.
Git has a mutable index called stage.
先用git status查看一下?tīng)顟B(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
#
# Untracked files:
# (use "git add <file>..." to include in what will be committed)
#
# LICENSEno changes added to commit (use "git add" and/or "git commit -a")
Git非常清楚地告訴我們沿猜,readme.txt被修改了枚荣,而LICENSE還從來(lái)沒(méi)有被添加過(guò),所以它的狀態(tài)是Untracked啼肩。
使用兩次命令git add橄妆,把readme.txt和LICENSE都添加后,用git status
再查看一下:
$ git status
# On branch master
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
#
# new file: LICENSE
# modified: readme.txt#
暫存區(qū)的狀態(tài)就變成這樣了
執(zhí)行g(shù)it commit就可以一次性把暫存區(qū)的所有修改提交到分支祈坠。
$ git commit -m "understand how stage works"
[master 27c9860] understand how stage works 2 files changed, 675 insertions(+) create mode 100644 LICENSE
一旦提交后害碾,如果你又沒(méi)有對(duì)工作區(qū)做任何修改,那么工作區(qū)就是“干凈”的:
$ git status
# On branch masternothing to commit (working directory clean)
6. 查看工作區(qū)和版本庫(kù)區(qū)別
git diff HEAD -- readme.txt
命令可以查看工作區(qū)和版本庫(kù)里面最新版本的區(qū)別:最后兩行
$ git diff HEAD -- readme.txt
diff --git a/readme.txt b/readme.txt
index 76d770f..a9c5755 100644
--- a/readme.txt
+++ b/readme.txt
@@ -1,4 +1,4 @@
Git is a distributed version control system.
Git is free software distributed under the GPL.
Git has a mutable index called stage.
-Git tracks changes.
+Git tracks changes of files.
7. 撤銷(xiāo)修改
(1)沒(méi)有add
你在readme.txt中添加了一行:
$ cat readme.txtGit is a distributed version control system.
Git is free software distributed under the GPL.
Git has a mutable index called stage.
Git tracks changes of files.
My stupid boss still prefers SVN.
你可以刪掉最后一行赦拘,手動(dòng)把文件恢復(fù)到上一個(gè)版本的狀態(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會(huì)告訴你,git checkout -- file可以丟棄工作區(qū)的修改:
$ git checkout -- readme.txt
命令git checkout -- readme.txt意思就是另绩,把readme.txt文件在工作區(qū)的修改全部撤銷(xiāo)儒陨,這里有兩種情況:
一種是readme.txt自修改后還沒(méi)有被放到暫存區(qū),現(xiàn)在笋籽,撤銷(xiāo)修改就回到和版本庫(kù)一模一樣的狀態(tài)蹦漠;
一種是readme.txt已經(jīng)添加到暫存區(qū)后,又作了修改车海,現(xiàn)在笛园,撤銷(xiāo)修改就回到添加到暫存區(qū)后的狀態(tài)隘击。
總之,就是讓這個(gè)文件回到最近一次git commit或git add時(shí)的狀態(tài)研铆。
(2).已經(jīng)調(diào)用了add
$ cat readme.txt
Git is a distributed version control system.
Git is free software distributed under the GPL.
Git has a mutable index called stage.
Git tracks changes of files.
My stupid boss still prefers SVN.
$ git add readme.txt
用git status查看一下埋同,修改只是添加到了暫存區(qū),還沒(méi)有提交:
$ git status
# On branch master
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
#
# modified: readme.txt
#
用命令git reset HEAD file可以把暫存區(qū)的修改撤銷(xiāo)掉(unstage)棵红,重新放回工作區(qū)
$ git reset HEAD readme.txt
Unstaged changes after reset:M readme.txt
git reset命令既可以回退版本凶赁,也可以把暫存區(qū)的修改回退到工作區(qū)。當(dāng)我們用HEAD時(shí)逆甜,表示最新的版本虱肄。
再用git status查看一下,現(xiàn)在暫存區(qū)是干凈的交煞,工作區(qū)有修改
$ 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")
最后丟掉工作區(qū)
$ git checkout -- readme.txt
$ git status
# On branch masternothing to commit (working directory clean)
(3)已經(jīng)commit了 那么參考版本回退一節(jié)
如果已經(jīng)push到了遠(yuǎn)程咏窿,那就真慘了
8.刪除文件
在Git中,刪除也是一個(gè)修改操作素征,先添加一個(gè)新文件test.txt到Git并且提交:
$ git add test.txt
$ git commit -m "add test.txt"
[master 94cdc44] add test.txt 1 file changed, 1 insertion(+) create mode 100644 test.txt
然后直接刪除
$ rm test.txt
這個(gè)時(shí)候集嵌,Git知道你刪除了文件,因此御毅,工作區(qū)和版本庫(kù)就不一致了根欧,git status命令會(huì)立刻告訴你哪些文件被刪除了:
$ 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)在你有兩個(gè)選擇,
一是確實(shí)要從版本庫(kù)中刪除該文件亚享,那就用命令git rm刪掉咽块,并且git commit:
$ git rm test.txtrm 'test.txt'
$ git commit -m "remove test.txt"
[master d17efd8] remove test.txt 1 file changed, 1 deletion(-) delete mode 100644 test.txt
另一種情況是刪錯(cuò)了,因?yàn)榘姹編?kù)里還有呢欺税,所以可以很輕松地把誤刪的文件恢復(fù)到最新版本:
$ git checkout -- test.txt
git checkout其實(shí)是用版本庫(kù)里的版本替換工作區(qū)的版本侈沪,無(wú)論工作區(qū)是修改還是刪除,都可以“一鍵還原”晚凿。但會(huì)丟失最近一次提交后你修改的內(nèi)容