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