本文爲git代碼管理及命令操作的入門知識,講述內容包括倉庫管理、clone+fetch+pull+push的流程、遠程操作、常規命令等。請批評指正。
第一部分:基礎概念(針對新手,使用過git的請跳過)
1.1 git與github的區別
git是版本控制工具,藉助此工具可以在本地倉庫、公司git服務器或者開源免費的github遠程倉庫上管理軟件版本。在多人協作的項目開發工作中十分普及。
github是免費的開源遠程倉庫。通俗點,就是有個免費的遠程服務器(遠程倉庫),可以管理你的代碼;如何與這個遠程倉庫進行交互,就需要靠git了。
1.2 本地倉庫、遠程倉庫的區別
倉庫repository就是管理項目代碼的地方。顧名思義,本地倉庫即存儲路徑在本地的倉庫;遠程倉庫即通過ssh、https協議等連接進行管理的倉庫。常見的遠程倉庫有公司自建的git服務器、github等。
1.3 分支branch的概念
圖片引用自,如有需要,請查看原圖
如上圖,同一個項目需要多人協作,每人有不同的分工,所以就創建了不同的分支。在B處創建3個分支,最開始大家的代碼都是一樣的。然後每人各自在此基礎上進行各自的工作,互不干擾。每個分支的代碼就開始慢慢有些區別,然後就要進行合併,根據需要合併到對應的分支上(或者master)上,以滿足項目需要求。
2 工作流程
圖片引用自阮一峯的網絡日誌,如有需要,請查看原圖
圖中,Remote指遠程倉庫,Repository指本地倉庫,workspace指工作區(按照本圖意思,workspace更像是分支,但又不太對),Index指緩存區。常見的工作流程如下:
<1> 在本地倉庫上新建一個分支,默認有個master分支
<2> 在該分支上進行相應的修改操作等,操作完利用add將修改提交到index, 利用commit提交到本地倉庫
<3> 本地倉庫可以利用clone從遠程倉庫直接克隆整個代碼庫;或者利用fetch只抓取更新,並利用merge合併
<4> 本地倉庫也可以利用pull拉取遠程倉庫的分支(獲取他人更新的代碼)
<5> 本地倉庫修改後的代碼可以push到遠程倉庫上
注:本人也是菜鳥,對這個圖理解的不透徹,望懂得人指導下。按照我的理解,workspace應該是分支,
但好像又不對。相信阮老師,他應該不會錯的。只是我能力不夠,理解不了。後期如果懂了,再更新。
3 本地倉庫操作
(安裝git,創建個人github賬戶後)從0開始的時候,首先要創建本地倉庫。
#git init會默認創建master分支(應該理解爲主支、主幹)
#在當前目錄新建倉庫
$ git init
#創建新的目錄,並初始化爲代碼庫
$ git init [project name]
# 將遠程倉庫的代碼clone進來
$ git clone [***.git]//可以使用https協議、ssh協議。不懂可以參考github上給的指令。
git init也可以更新當前已有的倉庫。創建後可以發現當前目錄裏存在.git目錄。
3.1 文件的操作
# git add系列用於將workspace分支中的文件添加到index暫存區(用語就以上圖爲例)
git add . //將當前目錄中的文件提交到緩存區,此後同類文件的更改並不會commit到對應分支。
git add [filename]//同理,只是針對文件
git add [directory name]//同理,將遞歸將目錄連同子目錄添加到暫存區
git add -u //只加修改過的文件,新增文件不加入
git add -i //交互式處理
# git rm系列用於刪除index暫存區的文件
git rm [filename]
# 重命令
git mv [old name] [new name]
3.2 提交到本地倉庫
#提交緩存區的文件至本地倉庫
$ git commit -m [message] //message 爲標註信息,可不加
# 將所有修改後的文件全部提交
$ git commit -a
# 提交時展示對應的信息
$ git commit -v
# 提交至定的文件至本地倉庫
$ git commit [files]
4 分支的創建與管理
剛纔說到git init創建本地倉庫的時候自動創建master分支。但是多人操作不能只在一個分支上幹活,於是有分支的創建與管理
4.1 新建、刪除分支
#列出當前所有branch
$ git branch
#創建新的branch
$ git branch [branch name] //沒有特別指定, 會由目前所在的branch直接複製
$ git branch [branch name] master //由master複製出新的branch
#刪除branch
$ git branch -d [branch name] //刪除branch
$ git branch -D [branch name] //強制刪除branch
$ git checkout -b [branch name] //產生新的branch, 並同時切換過去
#與remote repository有關
$ git branch -r //列出所有Repository branch
$ git branch -a //列出所有branch
4.2 切換分支
#切換到branch-name
$ git checkout [branch-name]
#以現在的環境爲基礎, 建立新的branch
$ git checkout -b [newbranch]
5 本地倉庫、遠程倉庫的交互
local repository 與remote repository的交互,主要用處有:本地修改完代碼,提交到遠程倉庫上;合併多分支的代碼;將遠程最新的代碼拉到本地等。常用指令有clone, pull, fetch, push, merge等(merge是用於不同分支之間的)
5.1 clone
#克隆版本庫,一條龍複製倉庫、版本、分支等
$ git clone [url]
#克隆版本到指定目錄
$ git clone [url] [dir]
5.2 remote
git remote 用於指定遠程主機的名字,用於管理遠程主機;方便管理,不然每次好長的名字
# 列出所有遠程主機
$ git remote
# 查看遠程主機的網址
$ git remote -v
# 查看主機詳細信息
$ git remote show [host-name]
# 添加遠程主機
$ git remote add [host-name] [url]
# 刪除遠程主機
$ git remote rm [host-name]
5.3 fetch
當遠程倉庫有更新時,利用fetch將更新同步到本地,切記只更新,不合並;合併需要使用merge
# 將倉庫所有更新全部取回本地
$ git fetch [host-name]
# 將遠程主機的特定分支更新到本地
$ git fetch [host-name] [branch-name]
# 查看遠程分支
$ git branch -r
# 查看所有分支
$ git branch -a
5.4 merge / rebase
5.3是隻更新沒合併,這樣遠程倉庫的修改行爲是無法反映到本地倉庫的,接下來就是合併了
#將遠程主機hostname上的branchname分支合併到當前分支,兩條指令都可以
$ git merge hostname/branchname
$ git rebase hostname/branchname
5.5 pull
git pull相當於先從遠程倉庫上更新,再合併。就是先操作git fetch ,再操作git merge
# 取回遠程主機的分支更新,並與本地指定分支合併
$ git pull origin next:master //將origin主機的next分支更新併合併到本地的master分支
# 與當前分支合併時,可省略冒號後面的目標分支
$ git pull origin dev //將origin的dev分支更新併合併到當前分支
# 手動指定(追蹤)本地分支與遠程分支的關聯
$ git branch --set-upstream-to=origin/next //當前分支關聯到遠程origin/next分支
# 如果當前分支與遠程分支存在關聯關係,git pull可以省略遠程分支名,如:
$ git pull origin //系統會讀取到跟蹤關係,所以對應的分支名是可以省略的
# 當遠程主機刪除某個分支時,默認情況下,git pull 不會在拉取遠程分支的時候刪除本地倉庫的對應分支。
# 但可以改變這個行爲,加上參數 -p,如下:
$ git pull -p //當遠程刪除某個分支時,本地倉庫會同步刪除
5.6 push
將本地更新推送到遠程主機上
# 本地分支的更新推到遠程主機
$ git push [hostname] [local-branch]:[remote-branch]
$ git push origin src:dst //將本地的src分支推送到遠程origin的dst分支
# 若省略遠程分支名,則表示將本地分支推送到關聯的遠程分支上;若該遠程分支不存在,則會被新建
$ git push origin dev //本地dev分支推送到遠程origin的dev分支;若dev不存在,則會被新建
# 不管是否存在遠程分支,都可以將本地分支推到遠程主機
$ git push --all origin //本地分支都推送到origin主機
言盡及此。面向新手,本文主要講述git的基本工作流程及基本指令,本人也是入門,如有錯誤,請批評指正。