[转] Git使用教程 -- 新手向
Git使用教程
Published on Feb 26, 2017?in?Tutorials?with?8 comments
教程?Git?Github
是的,這跟上一篇文章一樣同是新手向教程,主要記錄我常用的Git操作和一些使用技巧和注意事項,希望可以幫到你。
這篇教程需要讀者懂點(diǎn)Command Line,不懂的話可以看一下我另外一篇文章:here
基礎(chǔ)知識
什么是Git?
Git 是一個命令行工具的集合,它可以幫你跟蹤和記錄文件的更改(源代碼,圖片等一切你想跟蹤回訪的)。有了它你可以恢復(fù)舊版本的項目,甚至可以比較、分析、合并和修改等。這個過程我們稱為版本控制。除了Git之外,我們還有SVN,Mercurial,Perforce,CVS,Bitkeeper等,幫助我們實(shí)現(xiàn)版本控制
Git的特點(diǎn)?
Git是分布式的,我們不需要一個主服務(wù)器來托管我們的項目的各個版本,相反,它是工作在你本地磁盤上的文件夾,這個存儲著Git管理的項目的文件夾,我們稱為repository。同時,你也可以把你的項目的副本放到線上,如Github或Gitlab,滿足多人協(xié)作和項目代碼共享的需要
安裝Git
這里只列出macOS的安裝,主要通過?homebrew?來安裝
brew install git如果你太新手的話,這里再推薦兩個客戶端軟件,GitHub Desktop?and?Sourcetree
配置Git
安裝完成后,我們需要添加一些配置信息。其他Git有很多配置項需要去填寫,這里我們就先去填寫最重要的兩項,user.name和?user.email
打開終端,輸入下面內(nèi)容
git config --global user.name "Chakhsu Lau" git config --global user.email chakhsu@email.com這里的"Chakhsu Lau"和chakhsu@email.com需要換成你的
配置好這兩項,這樣每對Git操作一次都會帶上上面你輸入的信息,從而跟蹤每次操作是誰在做
更多了解可以查看:here
創(chuàng)建Repository
上面我們已經(jīng)提到了,Git管理和存儲文件是在你磁盤的文件夾上進(jìn)行的。在終端輸入下面內(nèi)容
cd ~/node mkdir git-demo cd git-demo git initgit init這句命令會告訴Git這個文件夾是特別的,同時也會在該文件夾下再創(chuàng)建一個.git文件夾用來存儲歷史信息和配置信息
初始化后會有下面的信息顯示
Initialized empty Git repository in /Users/chakhsu/node/git-demo/.git/說明我們的Git Repository已經(jīng)創(chuàng)建完畢,不過里面是空的,我們需要創(chuàng)建一個文件hello.txt
touch hello.txt查看Repo狀態(tài)
git status可以幫助我們查看當(dāng)前Repository的狀態(tài),包括哪些文件更新了,哪些是新添,哪些是被刪除了等等
git statusOn branch masterInitial commitUntracked files:(use "git add <file>..." to include in what will be committed)hello.txtnothing added to commit but untracked files present (use "git add" to track)這里返回的信息,就是上面我們添加的文件。這段信息告訴我們該文件是新的,但git還不知道是否需要去跟蹤它還是要選擇忽略它,所以我們進(jìn)入 Git Staging 的學(xué)習(xí)
操作Stage狀態(tài)
Git有一個“staging area”的概念。你可以把它想象為你的學(xué)生時期的書包,里面有各種作業(yè)本和書本(既是你的文件),這些作業(yè)本有些完成了作業(yè),有些完成了一部分,有些還未做,甚至有些還是新的。你可以通過git add選擇哪些作業(yè)本是需要提交的,這些被選擇的作業(yè)本就進(jìn)入了Stage狀態(tài),等待最后被git commit
如果選擇其中一個文件,則如下
git add hello.txt如果選擇全部,則如下
git add -A如果只選擇修改過的文件,不包括新增的文件和還未commit過的文件,則如下
git add .我們這里執(zhí)行第一個選擇,然后查看Git狀態(tài),如下
git status On branch masterInitial commitChanges to be committed:(use "git rm --cached <file>..." to unstage)new file: hello.txt發(fā)現(xiàn)Git已經(jīng)知道了我們的hello.txt已經(jīng)做好被提交上去的準(zhǔn)備了
如果我們要取消hello.txt這個文件的Stage狀態(tài)(取消add),則如下
git reset hello.txt操作Commit狀態(tài)
將Staging的項目commit一下,就是將當(dāng)前項目所在的Repository給定一個時間點(diǎn)狀態(tài),同時還要加一段描述去簡述這次的commit的內(nèi)容,就像平時說的快照,我們可以隨時回去看看它怎么樣
git commit -m "Initial commit."[master (root-commit) b1adc8d] Initial commit.1 file changed, 0 insertions(+), 0 deletions(-)create mode 100644 hello.txt這句話的意思,跳過編輯器直接輸入 commit 簡述,完成提交,并顯示一些信息
我們還可以這樣,如下
git commit -am "Initial commit."這句話的意思是,先執(zhí)行g(shù)it add .再跳過編輯器直接輸入 commit 簡述,完成提交
如果我們要修改上一次 commit 的簡述,如下
git commit --amend然后跳出編輯器,讓你修改當(dāng)前的簡述
如果我們要取消剛剛的 commit ,但要保留修改過的文件或者項目,如下
git reset HEAD^ --soft如果我們要回到上一次commit干凈的狀態(tài),如下
git reset HEAD^ --hard遠(yuǎn)程Repo
上面的基礎(chǔ)知識是在本地上操作,所有的commit都是僅存在項目里的.git文件夾內(nèi)。雖然本地的Repository是夠用的,但大多數(shù)的情況下,我們需要共享或者部署我們的項目到線上,或者是托管到遠(yuǎn)程Repositories
連接遠(yuǎn)程Repo
這個時候,需要我們到Github上注冊賬號,然后在上面創(chuàng)建空的Repository,假設(shè)我們已經(jīng)都注冊好和創(chuàng)建好Repository
這個Repository的地址是https://github.com/chakhsu/lilicia.git,這里的地址需要換成你自己的,這里只是作為教程使用
然后,打開終端輸入 如下
git remote add origin https://github.com/chakhsu/lilicia.git一個項目可能有多個遠(yuǎn)程Repositories,為了區(qū)分不同的遠(yuǎn)程Repositories,我們就要給他們起不同的名字,這里的origin,就是這支Repositories的名字
上傳到服務(wù)器
剛剛我們已經(jīng)連上了遠(yuǎn)程Repositories,但上面還沒有任何東西,需要我們把commit好的文件上傳到遠(yuǎn)程Repositories
git push origin masterCounting objects: 3, done. Writing objects: 100% (3/3), 211 bytes | 0 bytes/s, done. Total 3 (delta 0), reused 0 (delta 0) To https://github.com/chakhsu/lilicia.git* [new branch] master -> master這里的git push還會要求你輸入你的github的用戶名和密碼才能運(yùn)行push
還有g(shù)it push是帶有兩個參數(shù),一個是遠(yuǎn)程Repo的名稱(我們這里稱為origin)和分支push(master是每個Repo的默認(rèn)分支)
克隆Repo
上面我已經(jīng)把本地的Repo上傳到Github上了,別人就能在Github上查看和瀏覽Repo上的東西,甚至能克隆到他們自己的本地上,如下
git clone https://github.com/chakhsu/lilicia.gitRepo就會在本地上自動創(chuàng)建,且本地上Repo版本為Github上的版本
獲取更新
你更新了Repo,別人可以通過git pull更新線上的Repo到自己的本地Repo
git pull origin masterFrom https://github.com/chakhsu/lilicia* branch master -> FETCH_HEAD Already up-to-date.這里的pull指下載遠(yuǎn)程的Repo并且合并本地的Repo
同樣地你可以這樣獲取別人的Repo
Branches管理
當(dāng)我們需要開發(fā)一個新的功能,最好的實(shí)踐是復(fù)制原始項目,在其副本上完成開發(fā),這個副本我們稱為分支(Branches)。這條分支有自己的版本控制,每次的修改都會跟其他項目有所區(qū)分,直到你決定合并它們。
分支管理的好處:
-
對于已經(jīng)穩(wěn)定工作的版本的代碼將不會有任何影響
-
多人協(xié)作共同開發(fā)
-
開發(fā)者可以在自己的分支上完成開發(fā),不會受他人的影響
-
當(dāng)不確定那個功能更好時,可以開出更多的分支,進(jìn)行對比
創(chuàng)建分支
每一個Repo的默認(rèn)分支都叫master,創(chuàng)建其他分支,使用git branch <name>,如下
git branch baranch-one或者git checkout -b <name>
git checkout -b baranch-one意思是創(chuàng)建該分支并且切換到該分支
至此,我們的baranch-one就創(chuàng)建完成,跟master分支上的版本一致
查看分支
列出所有本地branch
git branch列出所有遠(yuǎn)程branch
git branch -r列出所有本地以及遠(yuǎn)程branch
git branch -a切換分支到baranch-one
git checkout baranch-one合并分支
上面我們已經(jīng)創(chuàng)建好分支baranch-one,需要我們選擇該分支,然后進(jìn)入,如下
git branch baranch-one * master git checkout baranch-one然后我們給該分支創(chuàng)建feature.txt,然后add和commit它
touch feature.txt git add feature.txt git commit -m "New feature complete."接著,我們需要切換master分支上
git checkout master下面這步就是合并分支
git merge baranch-one合并之后,原來的baranch-one已經(jīng)不需要了,可以刪除了,如下
git branch -d baranch-one進(jìn)階教程
這部分可能會在我們的日常開發(fā)過程中用到,知道并且會用就可以了
檢查commits
我們每一次的commit都有隨機(jī)生成一個唯一id,它由一串?dāng)?shù)字和字母組成,如果要查看所有commit以及它的id,我們可以用git log,如下
git logcommit 108e80c5d06dc802c2000d7085dcd2bd4162e666 Author: Your Name <youname@mail.com> Date: Sun Feb 26 00:56:14 2017 +0800Initial commit.如果要查看具體的某次commit,我們可以用git show [commit],如下
git show 108e80c5commit 108e80c5d06dc802c2000d7085dcd2bd4162e666 Author: Your Name <youname@mail.com> Date: Sun Feb 26 00:56:14 2017 +0800Initial commit.diff --git a/hello.txt b/hello.txt new file mode 100644 index 0000000..e69de29如果要查看兩次commit之間的不同,我們可以用 git diff?[commit-from]..[commit-to],這里就不演示了
恢復(fù)文件
上面其實(shí)已經(jīng)提到了,這里再補(bǔ)充說明
git checkout hello.txt git checkout 108e80c5 hello.txt這兩個命令,前者是將hello.txt恢復(fù)到最近一次的commit狀態(tài),而后者則是指定恢復(fù)到某個commit的狀態(tài)
處理合并沖突
很多時候,我們經(jīng)常要進(jìn)行多人協(xié)作,共同開發(fā),我們不停地操作著創(chuàng)建分支合并分支。在這個過程中,就有可能會出現(xiàn)合并沖突。
讓我們來看一下例子。首先我們創(chuàng)建了兩個分支,分別叫branch-chakhsu和branch-ping,都要在同一個文件中寫一個函數(shù)來顯示數(shù)組的所有元素
假設(shè)這個同一個文件為showarray.js
branch-chakhsu分支的寫法,如下
// Use a for loop to console.log contents. for(var i=0; i<arr.length; i++) {console.log(arr[i]); }branch-ping分支的寫法,如下
// Use forEach to console.log contents. arr.forEach(function(item) {console.log(item); });然后我們都對上面兩個分支合并,然后就會報錯
git checkout master git merge branch-chakhsu git merge branch-pingAuto-merging showarray.js CONFLICT (content): Merge conflict in showarray.js Automatic merge failed; fix conflicts and then commit the result.然后我們打開showarray.js,發(fā)現(xiàn)
<<<<<<< HEAD // Use a for loop to console.log contents. for(var i=0; i<arr.length; i++) {console.log(arr[i]); } ======= // Use forEach to console.log contents. arr.forEach(function(item) {console.log(item); }); >>>>>>> Ping's commit.<<<<<<< HEAD和=======之間是當(dāng)前我們所在的分支的commit內(nèi)容
=======和>>>>>>> Ping's commit.是我們要合并的branch-ping分支的內(nèi)容
這個時候我們要做決定選擇是兩個都要留下,還是選擇其中一個或者改成自己想要的內(nèi)容,這里改成我們想要的內(nèi)容
刪除<<<<<<< HEAD和>>>>>>> Ping's commit.之間的內(nèi)容,修改為
// Not using for loop or forEach. // Use Array.toString() to console.log contents. console.log(arr.toString());將修正的文件加入到stage狀態(tài),然后重新commit一次,如下
git add showarray.js git commit -m "Array printing conflict resolved."合并沖突就此解決了。當(dāng)我們發(fā)生沖突的時候,處理步驟如下
-
將發(fā)生沖突的文件打開編輯,處理內(nèi)容
-
使用git add將處理好的文件加入stage
-
重復(fù)上面兩個步驟,直到所有沖突處理完畢
-
git commit提交,完成
配置 .gitignore
很多時候,我們并不需要所有文件都需要git add,尤其當(dāng)我們使用git add -A的時候,這個命令是選擇所有文件進(jìn)入stage狀態(tài)。有什么辦法可以避免?那就是配置.gitignore文件
下面這些文件或者文件夾是可以被忽略
-
日志文件(log)
-
程序運(yùn)行任務(wù)創(chuàng)建的文件夾
-
Node.js中的node_modules文件夾
-
IDE創(chuàng)建的文件
-
和一些開發(fā)者自己的個人文件
根據(jù)上面的清單,我們可以修改.gitignore文件的內(nèi)容為
*.log build/ node_modules/ .idea/ my_notes.txt總結(jié)
寫了好久,自己也看了挺多資料,也算是一次大復(fù)習(xí),另外,文章可能有錯誤,歡迎指正
這里再列出編寫這篇教程發(fā)現(xiàn)到資料,希望能幫到你
-
Git官方文檔:here
-
Git的客戶端:here
-
GitHub Git 備忘單:here
-
GitHub 練習(xí)小游戲:here
-
.gitignore在線生成器:here
教程編寫結(jié)合了實(shí)踐和參考了下面文章
tutorialzine.com/2016/06/learn-git-in-30-minutes/
blog.gogojimmy.net/2012/01/21/how-to-use-git-2-basic-usage-and-worflow/
?
轉(zhuǎn)自:Git使用教程
? ? ? ? ? ?本文由?Chakhsu Lau?創(chuàng)作,采用?知識共享署名4.0?國際許可協(xié)議進(jìn)行許可
總結(jié)
以上是生活随笔為你收集整理的[转] Git使用教程 -- 新手向的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: armbian宝塔_斐讯N1+Armbi
- 下一篇: android悬浮窗只只点击按钮,只有安