【程式碼管理】GitHub超詳細圖文攻略 - Git客戶端下載安裝 GitHub提交修改原始碼工作流程 Git分支 標籤 過濾 Git版本工作流

韓曙亮發表於2014-01-29

GitHub操作總結 : 總結看不明白就看下面的詳細講解.

.

作者 :萬境絕塵 

轉載請註明出處 : http://blog.csdn.net/shulianghan/article/details/18812279

.


GitHub操作流程 :


第一次提交 :  

方案一 : 本地建立專案根目錄, 然後與遠端GitHub關聯, 之後的操作一樣;

-- 初始化git倉庫 :git init ;

-- 提交改變到快取 :git commit -m 'description' ;

-- 本地git倉庫關聯GitHub倉庫git remote add origin git@github.com:han1202012/TabHost_Test.git ;

-- 提交到GitHub中git push -u origin master ;

方案二 : 方案二就是不用關聯GitHub倉庫, 直接從GitHub沖剋隆原始碼到本地, 專案根目錄也不用建立;

-- 從GitHub上克隆專案到本地 :git clone git@github.com:han1202012/NDKHelloworld.git , 注意克隆的時候直接在倉庫根目錄即可, 不用再建立專案根目錄 ;

-- 新增檔案 :git add ./* , 將目錄中所有檔案新增;

-- 提交快取 :git commit -m '提交';

-- 提交到遠端GitHub倉庫git push -u origin master ;

之後修改提交

-- 與GitHub遠端倉庫同步 :git pull ;

-- 檢視檔案變更git status ;

-- 提交程式碼到本地快取git commit -m 'description';

--提交程式碼到遠端GitHub倉庫 :git push ;


.gitignore用法 : 開放模式 註明忽略的檔案 直接列出檔名, 保守模式 註明保留的檔案 !檔名 ;


Git標籤操作 : 輕量級標籤, 帶註釋標籤;

--檢視標籤 :git tag ;

--新增標籤 : 輕量級標籤git tag tagName , 帶註釋標籤git tag -a tagName -m 'description' ;

--刪除標籤 :git tag -d tagName ;

--提交標籤到GitHub中git push origin --tags ;


Git分支操作: 建立分支後, 分支操作不會影響master分支, 但是master分支改變會影其它分支;

--列出分支 :git branch ;

--切換分支 :git checkout master ;

--提交分支git push origin branchName ;

--刪除分支 : git branch -d branchName , 強制刪除分支 git branch -D branchName ;

--合併分支 : git merge branchName ;


.

一. Git介紹


分散式 : Git版本控制系統是一個分散式的系統, 是用來儲存工程原始碼歷史狀態的命令列工具;


儲存點 : Git的儲存點可以追蹤原始碼中的檔案, 並能得到某一個時間點上的整個工程專案額狀態; 可以在該儲存點將多人提交的原始碼合併, 也可以會退到某一個儲存點上;


Git離線操作性 :Git可以離線進行程式碼提交, 因此它稱得上是完全的分散式處理, Git所有的操作不需要線上進行; 這意味著Git的速度要比SVN等工具快得多,  因為SVN等工具需要線上時才能操作, 如果網路環境不好, 提交程式碼會變得非常緩慢; 


Git基於快照 : SVN等老式版本控制工具是將提交點儲存成補丁檔案, Git提交是將提交點指向提交時的專案快照, 提交的東西包含一些後設資料(作者, 日期, GPG等);


Git的分支和合並 : 分支模型是Git最顯著的特點, 因為這改變了開發者的開發模式, SVN等版本控制工具將每個分支都要放在不同的目錄中, Git可以在同一個目錄中切換不同的分支;

分支即時性 : 建立和切換分支幾乎是同時進行的, 使用者可以上傳一部分分支, 另外一部分分支可以隱藏在本地, 不必將所有的分支都上傳到GitHub中去;

分支靈活性 : 使用者可以隨時 建立 合併 刪除分支, 多人實現不同的功能, 可以建立多個分支進行開發, 之後進行分支合併, 這種方式使開發變得快速, 簡單, 安全;


二. Git通用客戶端(msysgit)


1. 下載Git客戶端


Git客戶端下載地址 :https://code.google.com/p/msysgit/downloads/list 將地址複製到瀏覽器欄即可下載.


2. 安裝Git客戶端


歡迎介面 : 直接下一步;



協議 : 必須接受;



安裝位置 : 預留100M空間, 自定義安裝位置;



選擇安裝元件 :也可以預設選擇;

-- 圖示元件(Addition icons) : 選擇是否建立快速啟動欄圖示 或者 是否建立桌面快捷方式;

-- 桌面瀏覽(Windows Explorer integration) : 瀏覽原始碼的方法, 單獨的上下文瀏覽 只使用bash 或者 只用Git GUI工具; 高階的上下文瀏覽方法 使用git-cheetah plugin外掛;

-- 關聯配置檔案 : 是否關聯git配置檔案, 該配置檔案主要顯示文字編輯器的樣式;

-- 關聯shell指令碼檔案 : 是否關聯Bash命令列執行的指令碼檔案;

-- 使用TrueType編碼 : 在命令列中是否使用TruthType編碼, 該編碼是微軟和蘋果公司制定的通用編碼; 



開始選單快捷方式目錄 : 設定開始選單中快捷方式的目錄名稱, 也可以選擇不再開始選單中建立快捷方式;



設定環境變數 : 選擇使用什麼樣的命令列工具, 一般情況下我們預設使用Git Bash即可, 預設選擇;

-- Git自帶 : 使用Git自帶的Git Bash命令列工具;

-- 系統自帶CMD : 使用Windows系統的命令列工具;

-- 二者都有 : 上面二者同時配置, 但是注意, 這樣會將windows中的find.exe 和 sort.exe工具覆蓋, 如果不懂這些儘量不要選擇; 



選擇換行格式

-- 檢查出windows格式轉換為unix格式 : 將windows格式的換行轉為unix格式的換行在進行提交;

-- 檢查出原來格式轉為unix格式 : 不管什麼格式的, 一律轉為unix格式的換行在進行提交;

-- 不進行格式轉換 : 不進行轉換, 檢查出什麼, 就提交什麼;



開始安裝 : 



安裝結束 : over;



3. 配置GitHub


修改Git Bash的配置 : 將Git Bash設定為快速編輯模式, 可以更好的使用該命令列工具 : 



(1) 建立本地ssh


使用命令 : 建立本地ssh

ssh-keygen -t rsa -C "13241153187@163.com"
GitHub郵箱 : 該命令後面的郵箱就是GitHub的註冊郵箱

路徑選擇 : 使用該命令之後, 會出現提示選擇ssh-key生成路徑, 這裡直接點回車預設即可, 生成的ssh-key在預設路徑中;

密碼確認 : 這裡我們不使用密碼進行登入, 用密碼太麻煩;



(2) 將ssh配置到GitHub中


進入生成的ssh目錄 : C:\Documents and Settings\Administrator\.ssh 中, 使用記事本開啟 id_rsa.pub 檔案, 將該檔案中的內容複製;

id_rsa.pub 檔案內容

ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAtT1YCeaNulpfC+ARqAWrCdfpi6CpW3gkGT0hp6Q8by7NnEfy4dah9CwSrNbWJH5eS4tiqckE+bdbSVNvAboFD1MtGZjtzE4GDweG/6J/SDYV/ADFN/RLWGb+5rQ8wMCjc/fODgLJDFxk1Fwk/TTqTcbtLab1toLcts3zGIW5DstA3RQ0CCX/sPew5m7vh7DcKXluj2TBd9hw== 13241153187@163.com

進入GitHub網站 : 登入GitHub, 選擇Account Setting 使用者設定 : 



選擇左側的SSH-KEY選項



點選右側的Add SSH key :

 


將上面複製好的ssh-key複製進去



驗證是否配置成功

使用命令

ssh -T git@github.com

成功提示如果出現Hi han1202012! You've successfully authenticated, but GitHub does not provide shell access. 就說明配置成功, 可以連線上GitHub;



(3) 配置本地使用者和郵箱


使用者名稱郵箱作用 : 我們需要設定一個使用者名稱 和 郵箱, 這是用來上傳本地倉庫到GitHub中, 在GitHub中顯示程式碼上傳者;

使用命令

git config --global user.name "HanShuliang" //設定使用者名稱
git config --global user.email "13241153187@163.com"  //設定郵箱



4. Git Bash提交原始碼到GitHub


(1) GitHub中建立一個工程


工程的https地址: https://github.com/han1202012/TabHost_Test.git .

工程的SSH地址 : git@github.com:han1202012/TabHost_Test.git .


GitHub提示生成的命令

-- Create a new repository on the command line : 

touch README.md
git init
git add README.md
git commit -m "first commit"
git remote add origin git@github.com:han1202012/TabHost_Test.git
git push -u origin master

-- Push an existing repository from the command line : 

git remote add origin git@github.com:han1202012/TabHost_Test.git
git push -u origin master


(2) 初始化git目錄


使用命令 : 

git init

如果不執行這條命令, 就會出現錯誤 : fatal: Not a git repository (or any of the parent directories): .git .


(3) 新增檔案


使用命令 : 

git add ./*


可能會報出一些警告, 不用理會 : 

warning: LF will be replaced by CRLF in AndroidManifest.xml.
The file will have its original line endings in your working directory.
warning: LF will be replaced by CRLF in bin/AndroidManifest.xml.
The file will have its original line endings in your working directory.
warning: LF will be replaced by CRLF in gen/shuliang/han/tabhost_test/BuildConfig.java.

將倉庫中的所有檔案新增到快取中;


(4) 提交快取


使用命令 : 

git remote add origin git@github.com:han1202012/TabHost_Test.git

將新增或者改變的內容提交到快取中;


(5) 將Git本地快取提交到GitHub中


使用命令 : 

git push -u origin master

執行該命令, 原始碼就被提交到了GitHub 中;


.

作者 :萬境絕塵 

轉載請註明出處 : http://blog.csdn.net/shulianghan/article/details/18812279

.


三. Git的一些用法


1. .gitignore檔案


遮蔽檔案 : .gitignore檔案是告訴Git哪些目錄或者檔案需要忽略, 這些檔案將不被提交; 

常用場景 : 寫完程式碼後會執行變異除錯等操作, 使用 .gitignore 檔案將這些編譯後的檔案遮蔽, 這些檔案不需要Git工具進行管理;

Android中的.gitignore : 在Android中 bin 和 gen 兩個目錄可以忽略;

.gitignore位置 : 專案根目錄下;


過濾模式 : Git中的 .gitignore 中有兩種模式,開放模式保守模式,保守模式的優先順序要高於開放模式;


開放模式 : 設定哪些檔案 活 目錄 被過濾, 凡是在檔案中列出的檔案或者目錄都要被過濾掉;

-- 過濾目錄 : /bin/ 就是將bin目錄過濾, 該檔案下的所有目錄和檔案都不被提交;

-- 過濾某個型別檔案 : *.zip *.class 就是過濾zip 和 class 字尾的檔案, 這些檔案不被提交;

-- 過濾指定檔案 : /gen/R.java, 過濾該檔案, 該檔案不被提交;


保守模式 : 設定哪些檔案不被過濾, 凡是列在其中的檔案都要完整的提交上去;

-- 跟蹤目錄 : !/src , 該目錄下的所有檔案都要被提交;

-- 跟蹤某類檔案 : !*.java , 凡是java檔案都要保留;

-- 跟蹤指定檔案 : !/AndroidManifest.xml , 該檔案需要保留, 提交上去;


配置原則 : 一般情況下采用開放模式魚保守模式共同使用;

eg : 一個目錄下有很多目錄和檔案, 當我們只需要保留其中的一個檔案的時候, 先用開放模式不保留這些檔案, 然後用保守模式將這個檔案留下來, 保守模式的優先順序要高於開放模式;


2. 標籤使用(Tag)


標籤作用: 在開發的一些關鍵時期,使用標籤來記錄這些關鍵時刻, 例如釋出版本, 有重大修改, 升級的時候, 會使用標籤記錄這些時刻, 來永久標記專案中的關鍵歷史時刻;


檢視標籤: 列出的標籤安裝ASCII字母順序確定, 排序沒有很明確的意義;

-- 列出所有的標籤 :  

git tag
-- 使用限定列出限定後的標籤

git tag -l v1.*



標籤分類 : Git中的標籤分為 輕量級標籤(lightweight) 和 帶註釋的標籤(annotated), 一般情況下推薦使用帶註釋的標籤, 如果標籤是臨時的可以採用輕量級標籤;

-- 輕量級標籤 : 輕量級標籤中的資訊含量很少, 這種標籤只代表某時刻程式碼的提交, 相當於指向這個提交的指標;

-- 帶註釋標籤 : 這種標籤是一種校驗和, 包含標籤名, 郵箱, 日期, 標籤資訊, GPG簽名 和 驗證, 它相當於一個物件, 封裝了這些資訊;


建立標籤 :

-- 建立輕量級標籤 : 這樣的標籤沒有附帶其它的資訊;

git tag v2.0


-- 建立帶註釋標籤 : -m 後跟的是註釋資訊, 當使用git show v2.1的時候, 會顯示這個註釋資訊;

git tag -a v2.1 -m 'first version'

-- 建立GPG私鑰的註釋標籤

git tag -s v2.1 -m 'GPG version'

在本機上實驗不成功 出現下面的錯誤

Administrator@XRDPTJ9ILK6IWRA /storage/TabHost_Test (master)
$ git tag -s v2.2 -m 'GPG version'
gpg: error loading `iconv.dll': 找不到指定的模組。

gpg: please see http://www.gnupg.org/download/iconv.html for more information
gpg: keyblock resource `c:/Documents and Settings/Administrator/.gnupg\secring.g
pg': file open error
gpg: keyblock resource `c:/Documents and Settings/Administrator/.gnupg\pubring.g
pg': file open error
gpg: skipped "HanShuliang <13241153187@163.com>": secret key not available
gpg: signing failed: secret key not available
error: gpg failed to sign the data
error: unable to sign the tag
以後再找原因;

-- 為之前的提交新增標籤 : 先使用 git log --oneline 命令列出之前的提交, 會有一個七位的十六進位制數進行標記, 使用git tag -a v3.1 f1bb97a 命令即可為這個提交新增標籤;

$ git log --oneline

f1bb97a first commit

git tag -a v3.1 f1bb97a


刪除標籤 : 使用命令 git tag -d 標籤名 命令刪除標籤;

git tag -d v0.1



驗證標籤 : 提交了GPG帶註釋標籤才可以驗證, 因為上面沒有提交成功, 這裡留下一個命令;

git tag -v v1.0


共享標籤 : 即將標籤提交到GitHub中;

git push origin --tags



3. 分支和合並


(1) 檢視現存分支


檢視現存分支 : git branch命令;

git branch

從結果可以看出, 現在只有一個分支master;


(2) 建立分支


建立分支 : git branch 分之名稱, 就可以建立一個分支, 建立完分支以後可以檢視分支, 當前使用的分支會顯示成為綠色, 前面帶有 "*", 如果不是當前使用的分支, 顯示的是白色, 並且沒有 "*" 字首;

git branch branch1


(3) 切換分支


切換分支 : git checkout 分支名稱, 切換分支以後, 在分支進行操作,檔案的改變不會體現在master主分支中, 主分支改變, 會體現在其它分支中;

git checkout branch1


關於主分支和其它分支

-- 分支編輯 : 現有兩個分支 master 主分支, 和剛建立的branch1 分支, 切換到 branch1 分支, 在branch1 中建立一個檔案 description_branch1.txt; 

-- 其它分支檔案不會影響主分支 : 然後在切換回 master 主分支, 發現沒有description_branch1.txt檔案, 建立一個檔案 description_master.txt;

-- 主分支會影響其它分支 : 在切換回 branch1 分支中, 發現存在 description_master.txt檔案;

.

對比過程


檢視該工程專案分支情況 : 

git branch

-- 分支結果

  branch1
* master


切換到 branch1 分支

git checkout branch1
-- 切換結果

Switched to branch 'branch1'


檢視 branch1 分支下的檔案

ls
-- 檢視檔案結果

AndroidManifest.xml  ic_launcher-web.png   res
assets               libs                  src
bin                  proguard-project.txt
gen                  project.properties

建立一個檔案

touch description_branch1.txt

新增這個檔案到本地快取 :

git add description_branch1.txt

提交本地快取 : 注意, 這裡必須提交, 如果不提交快取, 這個檔案在主分支也會出現;

git commit -m 'add a description of branch1'
-- 提交結果結果

[branch1 7f5785e] add a description of branch1
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 description_branch1.txt

檢視該分支下的檔案

ls
-- 檢視檔案結果

AndroidManifest.xml      libs
assets                   proguard-project.txt
bin                      project.properties
description_branch1.txt  res
gen                      src
ic_launcher-web.png

切換回主分支

git checkout master

-- 切換分支結果

Switched to branch 'master'
Your branch is up-to-date with 'origin/master'.


檢視主分支檔案

ls
-- 檢視檔案結果 : 沒有在 branch1 中新增的檔案;

AndroidManifest.xml  ic_launcher-web.png   res
assets               libs                  src
bin                  proguard-project.txt
gen                  project.properties


.


(4) 提交分支 


提交分支命令 : 將本地的分支提交到 GitHub中;

git push origin experiment


(5) 分支合併移除


合併分支命令 : 合併分支之後, 分支中有的檔案在 主分支中也會顯示, 相當於將branch1 分支中的檔案拷貝了一份到master分支中;

git merge branch1
合併結果

Updating f1bb97a..7f5785e
Fast-forward
 description_branch1.txt | 0
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 description_branch1.txt




.

(6) 刪除分支


刪除分支命令

git branch -d branch1

強制刪除分支命令 : 如果branch1 分支還沒有被合併的話, Git是不允許刪除這個分支的, 此時要想刪除該分支, 就只能使用下面的命令強制刪除該分支 : 

git branch -D branch1


4. Git工作流程


(1) 兩種工作流程


協作開發工作流程 : 這種情況是最複雜的情況, 多人團隊共同開發一個專案;

-- 與遠端倉庫同步 : git pull ;

-- 修改檔案 : 新增 刪除 修改檔案;

-- 檢視變更 : git status ;

-- 載入變更 :新增檔案, 先使用git add fileName, 在使用 git commit -m 'note' 載入變更; 如果是刪除 修改檔案, 直接使用 git commit -m 'note' 提交;

-- 重複 : 重複執行 修改檔案 檢視變更 載入變更 提交載入動作;

-- 上傳 : 使用 git push 命令將專案原始碼提交帶GitHub中去;


單獨開發工作流程 : 如果是個人獨立開發, 僅追蹤本地檔案變更, 就不需要提交到伺服器上, 因為Git是分散式的;

-- 修改檔案

-- 提交變更

-- 重複


(2) 簡單示例


1> 獨立開發示例


該示例不會上傳, 僅在本地進行操作;


從GitHub中檢出專案原始碼 : 注意, 檢出的原始碼是根目錄原始碼, 我們在總倉庫的根目錄檢出即可,不同再為專案建立目錄;

git clone git@github.com:han1202012/AndroidPictureViewer.git
-- 檢出克隆結果

Cloning into 'AndroidPictureViewer'...
remote: Counting objects: 86, done.
remote: Compressing objects: 100% (62/62), done.
remote: Total 86 (delta 3), reused 86 (delta 3)
Receiving objects: 100% (86/86), 1.67 MiB | 109.00 KiB/s, done.
Resolving deltas: 100% (3/3), done.
Checking connectivity... done.

刪除bin和gen目錄 : 這兩個目錄是Android工程編譯產生的臨時檔案, 沒有必要上傳到GitHub中去;

 rm -rf bin gen
-- 檢視刪除結果狀態

 git status
-- 結果

On branch master
Your branch is up-to-date with 'origin/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:    bin/AndroidManifest.xml
        deleted:    bin/ImageView_Test.apk
        deleted:    bin/classes.dex
        deleted:    bin/res/crunch/drawable-xxhdpi/ic_launcher.png
        deleted:    bin/resources.ap_
        deleted:    gen/shuliang/han/imageview_test/BuildConfig.java
        deleted:    gen/shuliang/han/imageview_test/R.java


提交快取

 git commit -a
-- 提交結果

[master e4377ba] delete bin and gen directory.
 28 files changed, 2 insertions(+), 110 deletions(-)
 create mode 100644 .gitignore
 delete mode 100644 bin/AndroidManifest.xml
 delete mode 100644 bin/ImageView_Test.apk
 delete mode 100644 bin/classes.dex
 delete mode 100644 bin/resources.ap_
 delete mode 100644 gen/shuliang/han/imageview_test/BuildConfig.java
 delete mode 100644 gen/shuliang/han/imageview_test/R.java


2> 協作開發示例


與遠端倉庫同步

git pull

-- 如果其他人沒有提交專案到GitHub上, 就會出現下面結果

Already up-to-date.

修改檔案後檢視變更

git status
-- 如果沒有變更會出現下面情況

On branch master
Your branch is ahead of 'origin/master' by 1 commit.
  (use "git push" to publish your local commits)

nothing to commit, working directory clean

載入變更 : 如果有變更, 那麼使用命令載入變更. 使用 git commit -a 或者 git add 命令;

-- 新增檔案 : 先使用 git add 檔名 來新增檔案到快取, 之後使用 git commit -m '' 命令提交程式碼到本地快取;

-- 刪除改變檔案 : 直接使用 git commit -m '', 提交刪除 或則 改變 到本地快取;


提交專案原始碼到伺服器

git push
-- 提交原始碼結果

warning: push.default is unset; its implicit value is changing in
Git 2.0 from 'matching' to 'simple'. To squelch this message
and maintain the current behavior after the default changes, use:

  git config --global push.default matching

To squelch this message and adopt the new behavior now, use:

  git config --global push.default simple

See 'git help config' and search for 'push.default' for further information.
(the 'simple' mode was introduced in Git 1.7.11. Use the similar mode
'current' instead of 'simple' if you sometimes use older versions of Git)

Counting objects: 4, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 292 bytes | 0 bytes/s, done.
Total 3 (delta 1), reused 0 (delta 0)
To git@github.com:han1202012/AndroidPictureViewer.git
   1ddf8c7..e4377ba  master -> master


檢視GitHub中的原始碼情況 : gen 和 bin 目錄果然被刪除了;


.

作者 :萬境絕塵 

轉載請註明出處  : http://blog.csdn.net/shulianghan/article/details/18812279

.


相關文章