手把手教你入门Git --- Git使用指南(Linux)
手把手教你入門(mén)Git — Git使用指南(Linux)
系統(tǒng):ubuntu 18.04 LTS
本文所有g(shù)it命令操作實(shí)驗(yàn)具有連續(xù)性,git小白完全可以從頭到尾跟著本文所有給出的命令走一遍,就會(huì)對(duì)git有一個(gè)初步的了解,應(yīng)當(dāng)能做到會(huì)用并且大致了解git的版本控制機(jī)制,遇到問(wèn)題的話歡迎留言或私信博主。
git安裝及配置
1 git安裝
sudo apt-get install git可通過(guò)git --version 命令查看,正常輸出git版本號(hào)即安裝成功。
2 配置用戶名和郵箱名
git config --global user.name "Your Name" git config --global user.email "email@example.com"配置完后可以通過(guò)以下命令查看
git config user.name git config user.email3 配置SSH公鑰
創(chuàng)建公鑰文件,生成的公鑰文件會(huì)保存在本機(jī)的~/.ssh目錄下。
ssh-keygen -C 'example@example.com' -t rsa然后三步詢問(wèn)直接回車(chē)即可(連按三次回車(chē))。
創(chuàng)建完成后進(jìn)~/.ssh目錄,將公鑰(即id_rsa.pub的內(nèi)容)復(fù)制出來(lái)。
cd ~/.ssh cat id_rsa.pub如果進(jìn)入該目錄時(shí)提示No such file or directory,自己手動(dòng)創(chuàng)建一個(gè)即可:mkdir ~/.ssh。
然后來(lái)到瀏覽器端進(jìn)行操作,首先登錄自己的github賬號(hào)(沒(méi)有的話自行注冊(cè)一個(gè)即可),進(jìn)入到自己的主頁(yè),依次點(diǎn)擊settings->SSH and GPG keys->New SSH Key,進(jìn)入到如下頁(yè)面:
將剛才保存的id_rsa.pub文件內(nèi)容復(fù)制到Key字段,Title自己起個(gè)名字,最好是能代表當(dāng)前所配置的機(jī)器的名字。然后點(diǎn)Add SSH key,會(huì)要求輸入當(dāng)前github賬號(hào)的密碼,按要求輸入就行了。
git本地操作
1 創(chuàng)建倉(cāng)庫(kù)并初始化
倉(cāng)庫(kù)(repository)也叫版本庫(kù),可以看做一個(gè)目錄,這個(gè)目錄里的所以文件都由Git進(jìn)行管理,每個(gè)文件的修改、刪除,Git都能跟蹤。
創(chuàng)建一個(gè)目錄mkdir learnGit
將我們新創(chuàng)建的目錄初始化為git可以管理的倉(cāng)庫(kù):
cd learnGit git init會(huì)輸出Initialized empty Git repository in /home/ps/JJ_Projects/learnGit/.git/,表示成功初始化git倉(cāng)庫(kù)。
這時(shí)會(huì)發(fā)現(xiàn)該目錄中多出了一個(gè).git目錄,這就是git來(lái)跟蹤管理版本庫(kù)的。
2 添加文件
我們首先創(chuàng)建一個(gè)README文件,并寫(xiě)入一些內(nèi)容:
touch README.txt vim README.txt # 寫(xiě)入 Learning Git: New File. cat README.txt # 查看文件內(nèi)容 # 輸出 Learning Git: New File.執(zhí)行g(shù)it add命令,將文件添加的倉(cāng)庫(kù)。
git add README.txt這條命令不會(huì)有輸出,具體作用后文會(huì)分析,這里我們先走一遍新建文件的步驟。
執(zhí)行g(shù)it commit命令,將文件提交的倉(cāng)庫(kù)。
git commit -m "Submit a new file." # 雙引號(hào)內(nèi)是本次提交的注釋,原則上可以隨便寫(xiě),但是盡量能表達(dá)出本次提交的改動(dòng)。會(huì)輸出:
[master (root-commit) 7e21c1f] Submit a new file.1 file changed, 1 insertion(+)create mode 100644 README.txt表示我們已經(jīng)成功提交一個(gè)新文件。
3 修改文件
我們剛剛已經(jīng)成功提交了一個(gè)新文件到我們的git倉(cāng)庫(kù),接下來(lái),我們來(lái)看一下怎樣修改文件的內(nèi)容。
修改文件內(nèi)容
vim README.txt # 將其中內(nèi)容替換為:Learning Git: Modify.查看倉(cāng)庫(kù)狀態(tài)
此時(shí),我們可以用git status命令來(lái)查看一下倉(cāng)庫(kù)當(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.txtno changes added to commit (use "git add" and/or "git commit -a")意思很明顯:README.txt文件提勁被修改過(guò)了,但是現(xiàn)在還沒(méi)有改動(dòng)需要git submit,因?yàn)橐萭it add。
查看文件改動(dòng)
用git diff查看文件有哪些改動(dòng):
git diff # 輸出: diff --git a/README.txt b/README.txt index 5107c06..e22e629 100644 --- a/README.txt +++ b/README.txt @@ -1 +1 @@ -Learning Git: New File. +Learning Git: Modify.即我們剛才進(jìn)行的修改。
向上面一樣,將修改添加到倉(cāng)庫(kù):
git add README.txt同樣沒(méi)有任何輸出,但是這次我們可以用git status來(lái)查看一下倉(cāng)庫(kù)當(dāng)前的狀態(tài):
git status # 輸出: On branch master Changes to be committed:(use "git reset HEAD <file>..." to unstage)modified: README.txt可以看到,已經(jīng)有一個(gè)改動(dòng)需要被commit了,可以推測(cè)add命令應(yīng)該是將文件的改動(dòng)放到了某個(gè)待提交的臨時(shí)位置,后面會(huì)具體分析。
那下一步就是提交咯:
git commit -m "Modify a file." # 輸出: [master a493237] Modify a file.1 file changed, 1 insertion(+), 1 deletion(-)文件修改提交成功,我們?cè)俨榭匆幌聜}(cāng)庫(kù)當(dāng)前狀態(tài):
git status # 輸出: On branch master nothing to commit, working tree clean我們剛剛把修改都提交了,所以現(xiàn)在沒(méi)有東西要提交。
4 版本回退
使用git進(jìn)行版本控制,重要的用途之一就是進(jìn)行版本回退了,我們來(lái)看一下怎樣操作。
我們先使用git log命令來(lái)查看一下倉(cāng)庫(kù)的修改日志:
git log # 輸出: commit a493237884485d9b0d6c88d64d967293ef5a80b8 (HEAD -> master) Author: user <example@example.com> Date: Wed Aug 18 20:09:27 2021 +0800Modify a file.commit 7e21c1fa1ada0c6b6dce6bef93f0c8e325d716a2 Author: user <example@example.com> Date: Wed Aug 18 19:56:17 2021 +0800Submit a new file.顯示出我們之前的兩次修改操作。
我們還可以加上--pretty=online參數(shù):
git log --pretty=oneline # 輸出: a493237884485d9b0d6c88d64d967293ef5a80b8 (HEAD -> master) Modify a file. 7e21c1fa1ada0c6b6dce6bef93f0c8e325d716a2 Submit a new file.我們先查看一下當(dāng)前README.txt文件中的內(nèi)容:
cat README.txt # 輸出: Learning Git: Modify. # 是我們上次修改文件后的內(nèi)容。使用git reset命令,將版本回退:
git reset --hard HEAD^ # HEAD表示當(dāng)前版本,HEAD^表示上一個(gè)版本,HEAD^^表示上上版本 輸出: HEAD is now at 7e21c1f Submit a new file.在查看一下版本回退之后README.txt中的內(nèi)容:
cat README.txt # 輸出: Learning Git: New File.可以看到,回退到了我們修改文件之前的內(nèi)容。
5 git的工作區(qū)和暫存區(qū)
在繼續(xù)介紹git的本地操作之前,我們先來(lái)看一下git的版本管理究竟是怎樣進(jìn)行的。
概念
工作區(qū)(Working Directory),我們創(chuàng)建的learnGit 目錄就是一個(gè)工作區(qū)。
版本庫(kù),倉(cāng)庫(kù)(Repository),工作區(qū)有個(gè)隱藏目錄 .git ,這個(gè)不算工作區(qū),而是 Git 的版本庫(kù)。
版本庫(kù)里面的 index(stage) 文件叫暫存區(qū),還有Git為我們自動(dòng)創(chuàng)建的第一個(gè)分支 master ,以及指向 master 的一個(gè)指針叫做 HEAD。
關(guān)系
前面我們提到過(guò),如果我們想把文件添加到Git里面時(shí),需要分兩步:
第一步是用 git add 把文件添加進(jìn)去,實(shí)際上就是把文件修改添加到暫存區(qū)。
第二步是用 git commit 提交更改,實(shí)際上就是把暫存區(qū)的所有內(nèi)容提交到當(dāng)前分支。(我們現(xiàn)在只有唯一一個(gè)分支 master,所以現(xiàn)在就是往 master 分支上提交更改)
6 管理修改
git做版本控制的關(guān)鍵優(yōu)勢(shì)在于:git跟蹤管理的不是文件,而是修改。
我們做這樣一個(gè)實(shí)驗(yàn):
首先,在README.txt中添加一行
vim README.txt # 添加一行 cat README.txt # 輸出: Learning Git: New File. test line 1.將此次修改add并查看狀態(tài)status:
git add README.txt git status # 輸出: On branch master Changes to be committed:(use "git reset HEAD <file>..." to unstage)modified: README.txtps@rong:~/JJ_Projects/learnGit$這時(shí)我們先不提交,而是再對(duì)README.txt進(jìn)行一次修改,按照我們之前的分析,現(xiàn)在我們的第一次修改應(yīng)該是保存在暫存區(qū)。
再次修改文件
vim README.txt # 再添加一行 cat README.txt # 輸出: Learning Git: New File. test line 1. test line 2.不對(duì)第二次修改進(jìn)行add,直接commit。現(xiàn)在的應(yīng)該是第一次修改在暫存區(qū),第二次修改在工作區(qū)沒(méi)動(dòng)。
git commit -m "test" # 輸出: [master 611366c] test1 file changed, 1 insertion(+)然后我們查看一下?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.txtno changes added to commit (use "git add" and/or "git commit -a")我們可以發(fā)現(xiàn),第二次修改并沒(méi)有被提交。
因?yàn)樵诠ぷ鲄^(qū)的第一次修改被放入暫存區(qū),準(zhǔn)備提交;而在工作區(qū)的第二次修改并沒(méi)有被放入暫存區(qū),所以, git commit命令只負(fù)責(zé)把暫存區(qū)的修改提交了。
提交后,我們可以用 git diff HEAD -- readme.txt命令去查看工作區(qū)和版本庫(kù)里面最新版本的區(qū)別:
git diff HEAD -- README.txt # 輸出: diff --git a/README.txt b/README.txt index be48ea2..0afce83 100644 --- a/README.txt +++ b/README.txt @@ -1,2 +1,3 @@Learning Git: New File.test line 1. +test line 2.7 撤銷(xiāo)修改
本地git的撤銷(xiāo)修改操作有三種具體情況,分別是:
(1) 僅修改文件,沒(méi)有add,此時(shí)修改僅在工作區(qū)。
(2) 修改文件后add過(guò),但是沒(méi)有commit ,此時(shí)修改保存在暫存區(qū)。
(3) 修改文件后,add并commit,此時(shí)修改已經(jīng)提交到倉(cāng)庫(kù)。
接下來(lái)我們一個(gè)一個(gè)看。
僅修改文件,沒(méi)有add,此時(shí)修改僅在工作區(qū)
我們上一個(gè)實(shí)驗(yàn)的第二次修改只存在工作區(qū),并未add,剛好符合第一種情況,這時(shí)的狀態(tài)應(yīng)該是這樣的:
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.txtno changes added to commit (use "git add" and/or "git commit -a")其實(shí)status的輸出信息已經(jīng)提示到我們了,此時(shí)使用checkout 命令即可:
git checkout -- README.txt然后我們查看一下文件內(nèi)容和狀態(tài)信息:
cat README.txt # 輸出: Learning Git: New File. test line 1. git status On branch master nothing to commit, working tree clean完美撤銷(xiāo)。
修改文件后add過(guò),但是沒(méi)有commit ,此時(shí)修改保存在暫存區(qū)
我們?cè)偬砑右恍袦y(cè)試、add,并查看此時(shí)狀態(tài):
vim README.txt # 添加一行 git add README.txt git status # 輸出: On branch master Changes to be committed:(use "git reset HEAD <file>..." to unstage)modified: README.txt還是可以從輸出信息看到,可以使用reset命令將放到暫存區(qū)的修改退回到工作區(qū)。
git reset HEAD README.txt # 輸出: Unstaged changes after reset: M README.txt 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.txtno changes added to commit (use "git add" and/or "git commit -a")從上面的狀態(tài)輸出可以看到,修改已經(jīng)成功地退回到工作區(qū)了。
現(xiàn)在就轉(zhuǎn)到了情況1,再用checkout命令撤銷(xiāo)就可以了。
git checkout -- README.txt git status # 輸出: On branch master nothing to commit, working tree clean改文件后,add并commit,此時(shí)修改已經(jīng)提交到倉(cāng)庫(kù)
這時(shí)已經(jīng)完車(chē)了修改的提交,只能進(jìn)行版本回退了,上面4已經(jīng)介紹,這里不再贅述。
8 刪除文件與恢復(fù)
我們先準(zhǔn)備一個(gè)待刪除的文件test.txt,并add、commit到倉(cāng)庫(kù),這一套大家想必已經(jīng)熟的不能再熟了,我們直接走一遍。
touch test.txt vim test.txt # 添加內(nèi)容 delete test git add test.txt git commit -m "delete test" # 輸出: [master 08ffedc] delete test1 file changed, 1 insertion(+)create mode 100644 test.txt在工作區(qū)中直接刪除test.py:
rm test.py這時(shí)有兩種情況:
(1) 工作區(qū)中誤刪文件,需要恢復(fù)
(2) 確實(shí)要?jiǎng)h除文件,應(yīng)該把刪除操作提交到倉(cāng)庫(kù)
工作區(qū)中誤刪文件,需要恢復(fù)
這種情況其實(shí)與上面的撤銷(xiāo)修改情況1是一樣的,要將工作區(qū)的動(dòng)作撤銷(xiāo)掉,而這在我們的倉(cāng)庫(kù)中還是存在的,所以還是要請(qǐng)出我們的checkout命令就好了。
git checkout -- test.txt ls # 輸出: README.txt test.txt可以看到,我們剛剛在工作區(qū)rm掉的test.txt文件已經(jīng)回來(lái)了
確實(shí)要?jiǎng)h除文件,應(yīng)該把刪除操作提交到倉(cāng)庫(kù)
我們先把剛剛恢復(fù)的test.txt再?gòu)墓ぷ鲄^(qū)刪掉。
rm test.txt既然我們確實(shí)要?jiǎng)h掉該文件,就直接再用git rm刪除:
git rm test.py # 輸出: rm 'test.txt'再將刪除操作提交到倉(cāng)庫(kù):
git commit -m "delete test" # 輸出: [master 9182ef7] delete test1 file changed, 1 deletion(-)delete mode 100644 test.txt就大功告成啦。
git遠(yuǎn)程操作
注意:遠(yuǎn)程倉(cāng)庫(kù)操作需要已經(jīng)完成SSH公鑰的配置。
新建遠(yuǎn)程倉(cāng)庫(kù)并關(guān)聯(lián)本地倉(cāng)庫(kù)
網(wǎng)頁(yè)端創(chuàng)建完倉(cāng)庫(kù)后回到本地命令行運(yùn)行如下命令,添加遠(yuǎn)程倉(cāng)庫(kù):
git remote add origin git@github.com:adenialzz/learngit.git注意改成自己的用戶名,這條命令不會(huì)有輸出。添加后,遠(yuǎn)程庫(kù)的名字就是 origin ,這是Git默認(rèn)的叫法。
然后,我們就可以使用git push命令將本地倉(cāng)庫(kù)推到遠(yuǎn)程倉(cāng)庫(kù)。
git push -u origin master # 輸出: Counting objects: 10, done. Delta compression using up to 20 threads. Compressing objects: 100% (5/5), done. Writing objects: 100% (10/10), 816 bytes | 816.00 KiB/s, done. Total 10 (delta 1), reused 0 (delta 0) remote: Resolving deltas: 100% (1/1), done. remote: This repository moved. Please use the new location: remote: git@github.com:Adenialzz/learnGit.git To github.com:adenialzz/learngit.git* [new branch] master -> master Branch 'master' set up to track remote branch 'master' from 'origin'.因?yàn)檫h(yuǎn)程庫(kù)是空的,所以我們?cè)诘谝淮瓮扑?master 分支時(shí),要加上 -u 參數(shù),Git不但會(huì)把本地的master 分支內(nèi)容推送的遠(yuǎn)程新的 master 分支,還會(huì)把本地的 master 分支和遠(yuǎn)程的 master 分支關(guān)聯(lián)起來(lái),在以后的推送或者拉取時(shí)就可以簡(jiǎn)化命令。
這時(shí),我們?cè)俚骄W(wǎng)頁(yè)端查看,就可以看到我們的本地倉(cāng)庫(kù)的全部?jī)?nèi)容已經(jīng)推倒遠(yuǎn)程倉(cāng)庫(kù)(當(dāng)然,這里只有一個(gè)文件,因?yàn)槲覀兊膖est.txt已經(jīng)被刪除掉了)。
將本地倉(cāng)庫(kù)推到遠(yuǎn)程
我們新建一個(gè)LICENSE.txt文件,提交到本地倉(cāng)庫(kù),并推到遠(yuǎn)程,這些操作上面到介紹過(guò)了,這里簡(jiǎn)單過(guò)一遍,
touch LICENSE.txt vim LICENSE.txt # 添加內(nèi)容 git add LICENSE.txt git commit -m "add LICENSE" git push origin master需要注意的是在第一次關(guān)聯(lián)過(guò)倉(cāng)庫(kù)之后,再推到遠(yuǎn)程時(shí),只需git push origin master,即可把本地 master 分支的最新修改推送至GitHub。現(xiàn)在,我們擁有了真正的分布式版本庫(kù)。
將遠(yuǎn)程倉(cāng)庫(kù)拉到本地
這個(gè)應(yīng)該是平時(shí)沒(méi)有深入了解git之前最常用的命令了(^^),將別人的代碼拉到本地。
點(diǎn)擊上圖的綠色的Code,將其中內(nèi)容復(fù)制下來(lái)
在本地使用clone命令進(jìn)行拉取:
git clone https://github.com/Adenialzz/learnGit.gitgit卸載
先找到git的目錄:通過(guò)which git命令,得到/usr/bin/git。
然后完全刪除該目錄,并卸載git:
sudo rm -r /usr/bin/git sudo apt-get remove git注意要完全卸載git,以上兩步缺一不可。
總結(jié)
以上是生活随笔為你收集整理的手把手教你入门Git --- Git使用指南(Linux)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 君康人寿5年保险能退吗
- 下一篇: linux如何加载镜像,linux可以加