Git&GitHub 學習1:Git學習(不斷更新)

1、認識 Git 和 GitHub

Git 是個版本控制系統,說明白點就是進行代碼的各類管理,好比你寫錯代碼進行回滾、追尋 BUG 是哪一個傢伙形成的、合併別人代碼等等,從而達到協同進行軟件開發工做。html

這裏要提下:版本管理控制系統分爲「集中式版本控制系統」和「分佈式版本控制系統」,不少人可能用過 SVN,就是屬於集中式版本控制系統,而 Git 屬於分佈式版本控制系統。關於二者區別自行搜索資料瞭解下。固然學習起來,Git 相對更難上手些。jquery

若是說準備學習 Git,我以爲結合 GitHub 來學習是很好的。說到這,或許還有人不知道 GitHub 是什麼,不要緊,我來解釋下,簡單講就是一個開源社區網站(也被你們叫爲「同性戀社區」,由於活躍着基本都是程序員呀,而這個羣體基本又都是 ♂ 捂臉.jpg)。linux

GitHub 聚集了全球很是多的程序大牛,包括 Linux 之父 Linus(這是他的 GitHub地址),而且 Linux 系統的代碼也是公開存放在這個網站(地址:github.com/torvalds/li…),任何人均可以查看整個源代碼。對於這樣一個社區網站,若是隻是人人能夠把代碼開源在上面以讓其餘人能夠閱讀並學習這樣的功能,這未免太單一了。實際,GitHub 網站有不少「好玩的」,包括容許用戶追蹤其餘用戶、組織、軟件庫的動態,對軟件代碼提出問題,發表評論等。ios

社羣功能再多,但最重要的仍是版本控制,好比 A 同窗開源了某個項目代碼,B、C 等同窗能夠先 fork A 的代碼到本身的帳戶,再 clone,即下載下來進行閱讀、修改。等修改了好代碼,能夠發起 Pull Request 提交 A,A 最後如果以爲代碼寫的沒任何問題,能夠贊成 Pull Request 並進行代碼合併。這樣經過多人努力,這個項目代碼將會愈來愈好。git

但整個過程一定離不開 Git 操做。雖然能夠選擇 Git GUI 客戶端軟件使用,但我仍是強烈建議一開始先學 Git 命令操做。學習 Git 命令操做能更好達到對 Git 的深層理解,以後能夠考慮使用 Git GUI。程序員

這裏補充下,對於如何爲別人的開源的項目貢獻代碼?假設你是 B 同窗,其大體流程以下:github

  1. 先點擊 A 同窗的項目倉庫站點的 fork 的按鈕,這樣的你的 GitHub 帳戶下也會有一個相同的倉庫;
  2. 而後把這個 fork 過來的倉庫代碼 Clone 到本地,而後你就開始對該項目代碼進行修改了,以爲修改 OK 了,就能夠 push 到你遠程倉庫(即你 GitHub 帳戶下 fork 來的那個倉庫),最後經過內建的「pull request」機制向項目負責人申請代碼合併;
  3. A 要是以爲你修改的代碼沒啥問題,就能夠贊成 pull request 了,贊成以後,你的代碼就合併到該項目了。這樣你就是該項目的貢獻者之一了。

說到這,估計仍是會存在部分人對 GitHub 以爲很陌生。這裏摘入網上一些文章和資料先了解和學習下吧:算法

系列文章: 從0開始學習 GitHub 系列 - stormzhang,推薦看完該系列文章。編程

如何建立項目:安全

關於 GitHub 網站:

2、Git 命令

2.1 認識 Git

簡單講講個人認識:首先 Git 屬於「分佈式版本控制系統」,先要好好理解這個分佈式與集中式的不一樣。

集中式的如 SVN,是有一臺中央服務器(其實就是某臺電腦安裝了 SVN 軟件),全部開發人員從本身電腦(好比 Eclipse 下安裝 SVN 插件)檢出項目代碼,任何一人修改了代碼就能夠提交至中央服務器,而後其餘人檢出(即更新、合併了代碼),這樣反覆重複的過程,其中包括衝突的解決等,這全部的代碼操做都記錄在中央服務器 SVN 中的。從中能夠看出這臺中央服務器的做用和重要性吧,說一個很明顯的問題:萬一中央服務器宕機了,你就不能提交,也不能更新代碼了。

分佈式的如 Git,是每一個人本地維護一個版本控制管理信息,那怎麼作到的呢?首先你本地須要安裝 Git ,這個軟件安裝完畢,新建目錄並在該目錄下執行 git init 就會有一個 .git 隱藏文件夾及內容,這個文件夾下內容維護着該目錄下的項目代碼狀況。但怎麼就分佈式呢?——大概是這樣的,GitHub (其實就能夠理解爲某臺電腦/服務器)上有別人提交上去的項目代碼,而後你 Clone (克隆/下載)來,你本地這份項目代碼就包含 .git 文件夾,裏面就有這個項目代碼的全部的版本信息,相似的,其餘任何人也能夠一樣 Clone 下來,也是有這樣一份這個項目代碼的全部的版本信息,而後大家均可以基於本身 Clone 下來的項目代碼進行代碼的修改了,本地會記錄你的修改、提交、回滾等等代碼操做信息,就算 GitHub 網站掛了也沒事,大家本地都有保持着這個項目代碼的全部版本控制信息。 大概意思你們再體會下。

而後這裏能夠涉及到不少關於 Git 的操做,還有一些概念,好比分支。我簡單說下分支,以某個 Android 項目爲例,好比該項目有個主分支 master 是專門用來對外發布上線的代碼,可是開發過程當中某個節點遇到某個 Bug 須要修復,則能夠在此開發節點新建一個好比 hotfix 分支來進行代碼的修復,修復好了再合併到主分支 master 上,而後能夠刪除掉 hotfix 分支。

能夠看出 Git 命令是學習的重點,要學的深入,最好懂得原理和本質。本文僅是我的的學習記錄,我把經常使用的命令整理和記錄在此,方便之後查找。

2.2 操做本地庫經常使用 Git 命令

一、git init

初始化一個目錄,其實初始化完畢而後本地多出了一個 .git的隱藏目錄,這個目錄管理着一個代碼庫的版本信息。

二、git add

把一個文件從untracked(未被追蹤)狀態轉爲到 staged狀態,直白的講,就是把文件提交到暫緩區,這個時候還沒真正意義上的代碼提交。格式爲:git add .提交全部改動,git add hello.txt提交指定文件的改動。

三、git commit

這步纔是真正的代碼提交到倉庫,格式爲:git commit或者加參數git commit -m 「此次的提交說明信息」,前者會進入一個頁面,輸入 i 能夠進入編輯界面,再寫上此次的提交的註釋說明信息(通常用來記錄本次提交的主要意圖),而後按 ESC 鍵退出編輯返回到命令模式,而後連續輸入兩個大寫的 "Z"(用 Shift 鍵或 Capslock 鍵均可以),就保存並退出了;後者的話直接能夠寫上提交的註釋說明信息。

若是在提交的時候出現提示設置郵箱和用戶名,是爲了保證提交的準確性,在提交的時候 user.name 和 user.email 會進入日誌,這些信息,是追蹤代碼變動的關鍵,好比是誰修改的。之後會隨更新內容一塊兒被永久歸入歷史記錄。

PS:在設置用戶名的時候,可使用任意的字符。Git 其實是使用 email 進行關聯每次提交的,只不過使用 username 做爲標示符來進行顯示。當你的 email 地址和 github上的 email 地址一致時,則會使用 Github 上面的 name 來進行顯示。

若是工做中只涉及一個 git 服務器,用一個全局配置就能夠了。

全局配置:

git config --global user.name "strivebo"
git config --global user.email "ishuzb@gmail.com"
複製代碼

非全局配置,某個項目下的配置:(去掉--global)

git config user.name "strivebo"
git config user.email "ishuzb@gmail.com"
複製代碼

可使用命令來查看修改後的配置:

git config --global user.name 或 git config user.name
git config --global user.email 或 git config user.email
複製代碼

取消全局配置:

git config --global --unset user.name
git config --global --unset user.email

git config --global user.name    #(查看)全局配置帳戶是否已經移除
git config --global user.email   #(查看)全局配置郵箱是否已經移除
複製代碼

四、git reset --hard

版本回退操做,好比我想把當前的版本回退到上一個版本,要使用什麼命令呢?可使用以下 2 種命令,第一種是:git reset --hard HEAD^。那麼若是要回退到上上個版本只需把 HEAD^ 改爲 HEAD^^ 以此類推。那若是要回退到前100個版本的話,使用上面的方法確定不方便,咱們可使用下面的簡便命令操做:git reset --hard HEAD~100 便可。

假設: 我進行了兩次修改,第一次 readme.txt 文件添加了 2222,第二次添加了 3333,我已經使用回退操做回到了第一次的修改,即如今文本內容爲 2222,但我其實又想回到第二次的修改,該怎麼辦呢(如何恢復 3333 內容呢)?能夠這樣:

經過以下命令便可獲取到版本號:git reflog,能夠看到增長內容 3333 的版本號是多少好比爲 6fcfc89,咱們如今能夠命令:git reset --hard 6fcfc89 來恢復了。

五、git status

查看倉庫文件狀態。能夠加參數 -s,即git status -s,加個 -s 用簡潔模式查看當前修改和倉庫裏面差異多少,能夠看到有多少文件被新增了,多少被修改了,多少被刪除了。

六、git log

查看提交歷史記錄,即版本歷史信息,好比誰提交的,什麼時間啊。

七、git diff

能夠顯示工做目錄和暫存區之間的不一樣(不加選項參數)。換句話說,這條指令可讓你看到「若是你如今把全部文件都 add,你會向暫存區中增長哪些內容」。好比git diff develop,查看當前版本和 develop 分支的差別。

八、git diff –cached

查看已經暫存起來的文件和上次提交的版本之間的差別。git diff –cached filename 查看已經暫存起來的某個文件和上次提交的版本之間的差別。

九、git diff --staged

使用 git diff --staged 能夠顯示暫存區和上一條提交之間的不一樣。換句話說,這條指令可讓你看到「若是你當即輸入 git commit,你將會提交什麼」。

十、git branch

查看有哪些分支,而且能看到當前處於哪一個分支上。注:初始化倉庫後默認有 master 這個主分支,通常狀況下不會輕易在該主分支操做。新建分支可使用git branch <newBranch>格式,如 git branch dev新建分支 dev,其內容和和主分支如出一轍。

十一、git branch -a:查看本地和遠程全部分支

十二、git branch -r:查看遠程全部分支

1三、git branch -v:查看遠程分支詳細信息

1四、git checkout a: 切換到 a 分支。

1五、git checkout -b a

有人就說了,我要先新建再切換,未免有點麻煩,有沒有一步到位的,有的:git checkout -b a 表示新建分支 a 並同時切換到分支 a。

1六、git merge

合併分支代碼,好比合並 dev 分代碼,須要先切換到 master 分支,再git merge dev便可合併 dev 分支代碼。

1七、git merge -- about

會嘗試恢復到你運行合併前的狀態。 但當運行命令前,在工做目錄中有未儲藏、未提交的修改時它不能完美處理,除此以外它都工做地很好。因爲如今 Git 倉庫處於衝突待解決的中間狀態,因此若是你最終決定放棄此次 merge,也須要執行一次 merge --abort 來手動取消它。輸入這行代碼,你的 Git 倉庫就會回到 merge 前的狀態。

1八、git branch -d

刪除分支。 假如這個分支新建錯了,或者a分支的代碼已經順利合併到 master 分支來了,那麼 a 分支沒用了,須要刪除,這個時候執行 git branch -d a 就能夠把a分支刪除了。

1九、git branch -D

強制刪除。有些時候可能會刪除失敗,好比若是 a 分支的代碼尚未合併到 master,你執行 git branch -d a 是刪除不了的,它會智能的提示你 a 分支還有未合併的代碼,可是若是你非要刪除,那就執行 git branch -D a 就能夠強制刪除 a 分支。

20、git tag

新建標籤。咱們在客戶端開發的時候常常有版本的概念,好比 v1.0、v1.1 之類的,不一樣的版本確定對應不一樣的代碼,因此我通常要給咱們的代碼加上標籤(即把某次提交標記爲某個 tags,如 v1.0),這樣假設 v1.1 版本出了一個新 bug,可是又不曉得 v1.0 是否是有這個 bug,有了標籤就能夠順利切換到 v1.0 的代碼,從新打個包測試了。因此若是想要新建一個標籤很簡單,好比 git tag v1.0 就表明我在當前代碼狀態下新建了一個 v1.0 的標籤,輸入 git tag 能夠查看歷史 tag 記錄。 想要切換到某個 tag,執行:git checkout v1.0,就能夠切換到 v1.0 的代碼狀態。

2一、git branch -vv

查看本地分支關聯(跟蹤)的遠程分支之間的對應關係,本地分支對應哪一個遠程分支。

2二、git push origin v0.1.2

表示將 v0.1.2 標籤提交到 Git 服務器(一般的 git push 不會將標籤對象提交到 Git 服務器,咱們須要進行該顯式操做)。若是將本地全部標籤一次性提交到 Git 服務器,能夠 git push origin –tags

2二、合併屢次 commit,參考以下

git rebase -i HEAD~4  #能夠看到最近 4 次的 commits,而後修改 commit 前面的爲 squash,改完後保存,後繼也會出現能夠填寫該次的 message
git add .
git rebase --continue 
git push -f 	# -f 強制推送到遠程服務器
複製代碼

2.3 操做遠程庫相關 Git 命令

一、git clone

遠程 clone 即複製/克隆一個完整的 repository (倉庫,即項目代碼)到本地,克隆倉庫時所使用的遠程主機自動被 Git 命名爲 origin,若是想用其餘的主機名,須要用git clone命令的-o選項指定。格式爲:git clone -o jQuery https://github.com/jquery/jquery.git,而後git remote命令查看,能夠看到名字爲遠程主機名 jQuery。

這裏要特別說下,這裏克隆能夠有兩種方式,一種 https 方式,一種 ssh 。

①若是是 https 方式,複製倉庫 https 地址進行 clone 操做,如:git clone https://github.com/strivebo/git-practice.git

這樣克隆下來的項目倉庫,注意觀察.git文件夾下的config中的文件 url:

[remote "origin"]
	url = https://github.com/strivebo/git-practice.git
	fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
	remote = origin
	merge = refs/heads/master
複製代碼

②若是是 ssh 方式,複製倉庫的 ssh 地址進行 clone 操做,如:git clone git@github.com:strivebo/git-practice.git

這樣克隆下來的項目倉庫,注意觀察.git文件夾下的config中的文件 url:

[remote "origin"]
	url = git@github.com:strivebo/git-practice.git
	fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
	remote = origin
	merge = refs/heads/master
複製代碼

注1: 能夠看到,https 方式下 url 爲 「https 地址」,ssh 方式下 url 爲「ssh 地址」(我就這麼任性表達了,反正意思明白就行),因此假設你採用的 https 方式 clone 下來的項目能夠經過修改這個 url 爲「ssh 地址」,這樣本地倉庫就至關因而使用了 「ssh 方式 clone 下來的」。

**注2:**二者的區別有,若採用的 https 方式,則每次提交代碼至 GitHub 時,都要求輸入 GitHub 帳號和密碼才能提交,若 ssh 方式,則不須要每次的輸入。但固然這前提是你已經添加 ssh 。

關於 SSH 協議的歷史,能夠看看這篇文章:SSH 協議(Secure Shell 協議)

這裏引用我看到的網上資料關於 https 和 SSH 的區別說下:

  1. 前者能夠隨意克隆 github上的項目,而無論是誰的;然後者則是你必須是你要克隆的項目的擁有者或管理員,且須要先添加 SSH key ,不然沒法克隆。
  2. https url 在 push 的時候是須要驗證用戶名和密碼的;而 SSH 在 push 的時候,是不須要輸入用戶名的,若是配置 SSH key 的時候設置了密碼,則須要輸入密碼的,不然直接是不須要輸入密碼的。

關於如何添加 ssh 下面是步驟:

  1. Linux 與 Mac 都是默認安裝了 SSH ,而 Windows 系統安裝了 Git Bash(即安裝了 Git 就有這個) 應該也是帶了 SSH 的,在終端輸入ssh命令能夠查看是否安裝了 ssh;

  2. 緊接着輸入 ssh-keygen -t rsa 或者ssh-keygen -t rsa -C "註釋"格式 ,就是指定 rsa 算法生成密鑰,接着連續三個回車鍵(不須要輸入密碼)而後就會生成兩個文件 id_rsa 和 id_rsa.pub ,而 id_rsa 是密鑰,id_rsa.pub 就是公鑰。這兩文件默認分別在以下目錄裏生成: Linux/Mac 系統 在 ~/.ssh 下,win系統在 /c/Documents and Settings/username/.ssh 下, 都是隱藏目錄,你們應該能找到的;

    注: 其實在連續安回車鍵中會提示輸入一個密碼以及確認密碼,這個密碼會在你提交項目時使用,若是爲的話(即直接按回車鍵,也即未設置密碼)提交項目代碼時則不用輸入密碼;

  3. 接下來要作的是把 id_rsa.pub 的內容添加到 GitHub 上(PS:如何添加自行網上搜下,就很少說了),這樣你本地的 id_rsa 密鑰跟 GitHub 上的 id_rsa.pub 公鑰進行配對,受權成功,這樣就能夠不用像 https 方式每次輸入帳號和密碼進行驗證身份才能提交了。(你就理解爲,SSH 就比如進行了身份驗證的這種理解。)

  4. SSH key 添加成功以後,輸入 ssh -T git@github.com 進行測試,若是出現如下提示,再輸入 yes 出現以下圖則證實添加成功了。(圖我就不截了,我以爲問題應該不大)

補充:對於命令 ssh-keygen添加不一樣參數的含義—— ssh-keygen參數說明

二、git remote

列出全部的遠程倉庫。從別處 clone 來的,默認都會有一個別名」origin」的倉庫。帶上 -v 能夠看到具體 URL。

三、git remote add

添加遠程倉庫地址。其實這些操做都是在本地,並無實際牽涉到遠程。另外 github 裏面fork 過來的,默認叫」upstream」。該命令完整格式爲:git remote add <主機名> <網址>,如git remote add orgin git@github.com:strivebo/git-practice.git

四、git remote rw

刪除遠程倉庫地址。格式爲:git remote rm <主機名>

五、git remote rename

用於遠程主機的更名。完整格式爲:git remote rename <原主機名> <新主機名>

六、git fetch

一旦遠程主機的版本庫有了更新(Git 術語叫作 commit),須要將這些更新取回本地,這時就要用到git fetch命令。格式爲:git fetch <遠程主機名>,默認狀況下,git fetch取回全部分支(branch)的更新。

  • 若是隻想取回特定分支的更新,能夠指定分支名,格式爲:git fetch <遠程主機名> <分支名>, 另外,所取回的更新,在本地主機上要用"遠程主機名/分支名"的形式讀取,好比origin主機的master,就要用origin/master讀取。
  • 取回遠程主機的更新之後,能夠在它的基礎上,使用git checkout命令建立一個新的分支,git checkout -b newBrach origin/master,該命令表示,在origin/master的基礎上,建立一個新分支。此外,也可使用git merge命令或者git rebase命令,在本地分支上合併遠程分支。

七、git pull

git pull命令的做用是,取回遠程主機某個分支的更新,再與本地的指定分支合併。至關於 fetch後,再進行 merge。其完整格式爲:git pull <遠程主機名> <遠程分支名>:<本地分支名>,如取回origin主機的next分支,與本地的master分支合併,能夠這樣寫:git pull origin next:master

  • 若是遠程分支是與當前分支合併,則冒號後面的部分能夠省略,即git pull origin next,該命令表示,取回origin/next分支,再與當前分支合併。實質上,這等同於先作git fetch,再作git merge

在某些場合,Git會自動在本地分支與遠程分支之間,創建一種追蹤關係(tracking)。好比,git clone的時候,全部本地分支默認與遠程主機的同名分支,創建追蹤關係,也就是說,本地的master分支自動"追蹤"origin/master分支。 Git也容許手動創建追蹤關係。

  • git branch --set-upstream master origin/next該命令指定master分支追蹤origin/next分支

  • 若是當前分支與遠程分支存在追蹤關係,git pull就能夠省略遠程分支名。git pull origin該命令表示,本地的當前分支自動與對應的origin主機"追蹤分支"(remote-tracking branch)進行合併

  • 若是當前分支只有一個追蹤分支,連遠程主機名均可以省略,git pull該命令表示,當前分支自動與惟一一個追蹤分支進行合併

  • 合併須要採用rebase模式,可使用--rebase選項。git pull --rebase <遠程主機名> <遠程分支名>:<本地分支名>

  • 若是遠程主機刪除了某個分支,默認狀況下,git pull 不會在拉取遠程分支的時候,刪除對應的本地分支。這是爲了防止,因爲其餘人操做了遠程主機,致使git pull不知不覺刪除了本地分支。可是,你能夠改變這個行爲,加上參數 -p 就會在本地刪除遠程已經刪除的分支。git pull -p 該命令等同於:

    git fetch --prune origin 
    git fetch -p
    複製代碼

八、git push

git push命令用於將本地分支的更新,推送到遠程主機。它的格式與git pull命令相仿。其完整格式爲:git push <遠程主機名> <本地分支名>:<遠程分支名>

  • 若是省略遠程分支名,則表示將本地分支推送與之存在"追蹤關係"的遠程分支(一般二者同名),若是該遠程分支不存在,則會被新建。git push origin master該命令表示,將本地的master分支推送到origin主機的master分支。若是後者不存在,則會被新建。
  • 若是省略本地分支名,則表示刪除指定的遠程分支,由於這等同於推送一個空的本地分支到遠程分支。git push origin :master等同於git push origin --delete master該命令表示刪除origin主機的master分支。
  • 若是當前分支與遠程分支之間存在追蹤關係,則本地分支和遠程分支均可以省略。git push origin該命令表示,將當前分支推送到origin主機的對應分支。
  • 若是當前分支只有一個追蹤分支,那麼主機名均可以省略。git push
  • 若是當前分支與多個主機存在追蹤關係,則可使用-u選項指定一個默認主機,這樣後面就能夠不加任何參數使用git pushgit push -u origin master該命令將本地的master分支推送到origin主機,同時指定origin爲默認主機,後面就能夠不加任何參數使用git push了。

注:不帶任何參數的git push,默認只推送當前分支,這叫作 simple 方式。此外,還有一種matching 方式,會推送全部有對應的遠程分支的本地分支。Git 2.0 版本以前,默認採用 matching 方法,如今改成默認採用 simple 方式。若是要修改這個設置,能夠採用git config命令。

$ git config --global push.default matching
# 或者
$ git config --global push.default simple
複製代碼

還有一種狀況,就是無論是否存在對應的遠程分支,將本地的全部分支都推送到遠程主機,這時須要使用--all選項。

$ git push --all origin
複製代碼

上面命令表示,將全部本地分支都推送到origin主機。

若是遠程主機的版本比本地版本更新,推送時Git會報錯,要求先在本地作git pull合併差別,而後再推送到遠程主機。這時,若是你必定要推送,可使用--force選項。

git push --force origin
複製代碼

上面命令使用--force選項,結果致使遠程主機上更新的版本被覆蓋。除非你很肯定要這樣作,不然應該儘可能避免使用--force選項。

最後,git push不會推送標籤(tag),除非使用--tags選項。git push origin --tags

九、刪除遠程分支:git push origin --delete <branchName>

不然,可使用這種語法,推送一個空分支到遠程分支,其實就至關於刪除遠程分支:git push origin :<branchName>

十、刪除 tag:git push origin --delete tag <tagname>

另外,這也是刪除 tag 的方法,推送一個空 tag 到遠程tag:git tag -d <tagname>git push origin :refs/tags/<tagname>

十一、修改還未 push 的註釋:git commit --amend,修改後保存退出。剛剛 push 到遠端尚未人其餘人下載或改動的:

git commit --amend
複製代碼

進入修改頁面修改註釋信息,修改後 :wq 保存退出。 再使用git push --force-with-lease origin master。若是其餘人已經下載或改動:

git fetch origin
git reset --hard origin/master
複製代碼

來源:git修改未push和已經push的註釋信息

2.4 參考資料

3、實戰學習

3.1 代碼提交到 GitHub 上

1) 兩種克隆 Clone 方式

一、採用 HTTPS 方式克隆 GitHub 上倉庫(項目):git clone https://github.com/strivebo/git-practice.git

二、採用 SSH 方式克隆:git clone git@github.com:strivebo/git-practice.git

  • 若是想要在克隆至本地時指定別的目錄名稱,能夠在後面加個參數,如:git clone https://github.com/strivebo/git-practice.git git-practice-another,手動指定本地倉庫的根目錄名稱爲 git-practice-another。

提下,GitHub 中的 SSH 和 HTTPS 提交區別:github中ssh和https提交的區別 | git使用ssh密鑰和https兩種認證方式彙總(轉)

解釋下:從 GitHub 上 Clone 一個項目到本地的時候,有 use https 和 use ssh 兩種方式,這兩種主要是在 push 項到 GitHub 上時有所不一樣。完成一個 push 操做,須要對其內容進行安全管理,這裏提供了 ssh 和 https 兩種方式。而在 Clone 項目到本地時,作出選擇後,就已經決定了 push 的方式。

SSH 使用了 RSA,即非對稱加密的方式,存在一個公鑰和私鑰。能夠生成一個本地的一組祕鑰,而後將公鑰複製到 GitHub 的 settings/profile 下。使用 https 方式,每次須要驗證用戶身份信息。

2) 採用 https 方式克隆

在使用 git status 命令查看倉庫狀態如果看到: your branch is ahead of 'origin/master' by 2 commits. ,解釋下:

  1. Git 提示你的當前 branch 已經領先於( "ahead of" )'origin/master' 兩個提交了
  2. origin/master 的中的 origin 是遠端倉庫的名稱,是你在用 Clone 指令初始化本地倉庫時 Git 自動幫你起的默認名稱;master 是 origin 上的分支名稱。

能夠暫時把 origin/master 簡單理解爲「中央倉庫」,也就是說,這句話是告訴你,你的本地倉庫已經領先中央倉庫兩個提交了。而後可使用 git push 提交發布至中央服務器(這裏即指 GitHub)。

由於採用的是 https 方式克隆,因此在這個過程 GitHub 會向你索要帳戶和密碼。填入正確的帳戶和密碼,push 操做就完成了。這時你再去你的 GitHub 倉庫頁面能夠看到提交記錄。說明你已經成功把本地倉庫的提交推送到了服務器了。

PS:若是以爲一遍遍地輸入密碼很煩,能夠按照 這個頁面 提供的方案來把密碼保存起來。另外還有一個更簡單但安全性低一些的方案。執行這行代碼:git config credential.helper store,在這以後你只須要再輸入一次密碼, Git 就會把你的密碼保存下來,這以後就不再用輸入了。說它「安全性低」,是由於這條指令會讓 Git 把你的密碼以明文形式保存在你的電腦上。具體這兩種保存密碼的方案選擇哪一個,看你本身了。

總結下:

  1. 從 GitHub 把中央倉庫 Clone 到本地把寫完的代碼提交。即先使用命令:git clone,再用 git add 文件名 把文件添加到暫存區,再用 git commit 提交;
  2. 在這個過程當中,可使用 git status 來隨時查看工做目錄的狀態。每一個文件有 "changed / unstaged"(已修改), "staged"(已修改並暫存), "commited"(已提交) 三種狀態,以及一種特殊狀態 "untracked"(未跟蹤);
  3. 提交一次或屢次以後,把本地提交 push 到中央倉庫(命令:git push)。

3) 採用 ssh 方式克隆

在擁有了一個 GitHub 帳號以後,就能夠自由的 Clone 或者下載其餘項目,也能夠建立本身的項目,可是你無法提交代碼。仔細想一想也知道,確定不可能隨意就能提交代碼的,若是隨意能夠提交代碼,那麼 GitHub 上的項目豈不亂了套了,因此提交代碼以前必定是須要某種受權的,而 GitHub 上通常都是基於 SSH 受權的。那麼什麼是 SSH 呢? 簡單點說,SSH 是一種網絡協議,用於計算機之間的加密登陸。目前是每一臺 Linux 電腦的標準配置。而大多數 Git 服務器都會選擇使用 SSH 公鑰來進行受權,因此想要在 GitHub 提交代碼的第一步就是要先添加 SSH key 配置。

添加 SSH 步驟:

  1. Git Bash下輸入 ssh 查看電腦是否安裝了 ssh;
  2. 緊接着輸入 ssh-keygen -t rsa,什麼意思呢?就是指定 rsa 算法生成密鑰,接着連續三個回 車鍵(不須要輸入密碼) ,而後就會生成兩個文件 id_rsaid_rsa.pub ,而 id_rsa 是密鑰,id_rsa.pub 就是公鑰。這兩文件默認分別在以下目錄裏生成: Linux/Mac 系統 在 ~/.ssh 下,Windows 系統在 /c/Documents and Settings/username/.ssh 下, 都是隱藏文件。
  3. 接下來要作的是把 id_rsa.pub 的內容添加到 GitHub 上,這樣你本地的 id_rsa 密鑰跟 GitHub 上的 id_rsa.pub 公鑰進行配對,受權成功才能夠提交代碼。
  4. SSH key 添加成功以後,輸入 ssh -T git@github.com 進行測試。

最後就是 push、pull 的操做了。添加 SSH key 成功以後,咱們就有權限向 GitHub 上咱們本身的項目提交代碼了。執行:git push origin master 進行代碼提交。

實踐: 假設咱們本地有個 test2 的項目,咱們須要的是在 GitHub 上建一個 test 的項目,而後把本地 test2 上的全部代碼 commit 記錄提交到 GitHub 上的 test 項目。

  1. 第一步就是在 GitHub 上建一個 test 倉庫,具體怎麼操做我就很少說了吧;

  2. 第二步切換到 test2 目錄,打開 Git Bash,把本地 test2 項目與 GitHub 上的 test 項目進行關聯:git remote add origin git@github.com:strivebo/test.git

    什麼意思呢?就是添加一個遠程倉庫,地址是 git@github.com:strivebo/test.git,而 origin 是給這個項目的遠程倉庫起的名字,是的,名字你能夠隨便取,只不過你們公認的只有一個遠程倉庫時名字就是 origin ,爲何要給遠程倉庫取名字?由於咱們可能一個項目有多個遠程倉庫?好比 GitHub 一個,好比公司一個,這樣的話提交到不一樣的遠程倉庫就須要指定不一樣的倉庫名字了。

注:查看咱們當前項目有哪些遠程倉庫能夠執行以下命令: git remote -v,接下來,咱們本地的倉庫就能夠向遠程倉庫進行代碼提交了:git push origin master,就是默認向 GitHub 上的 test 倉庫提交了代碼,而這個代碼是在 master 分支,固然你能夠提交到指定的分支。

再次強調: Git 使用 https 協議,每次 pull,push 都要輸入密碼,至關的煩。使用 Git 協議,而後使用 ssh 密鑰,這樣能夠省去每次都輸密碼。

4、問題和筆記

4.1 問題

1. fatal the current branch master has no upstream branch

對於前面這個「假設咱們本地有個 test2 的項目,咱們須要的是在 GitHub 上建一個 test 的項目,而後把本地 test2 上的全部代碼 commit 記錄提交到 GitHub 上的 test 項目。」實踐練習有出現了問題,報錯是:fatal the current branch master has no upstream branch.

參考網上資料:

個人總結:若是沒有添加 ssh,沒采用 ssh 方式克隆,那採用 https 方式克隆,如:git remote add origin https://github.com/strivebo/test.git,而後,下面是引用的網上一我的的解決方式:

此時若是 origin 的 master 分支上有一些本地沒有的提交,push 會失敗。因此解決的辦法是,首先設定本地 master 的上游分支:git branch --set-upstream-to=origin/master,而後 pull:git pull --rebase,最後再 push:git push

2. 官網下載的 Git 與 TortoiseGit 客戶端的關係?

Git 自帶GUI界面。使用 git gui 命令能夠打開它。在這個界面中能夠完成 commit、merge、push、pull 等等經常使用操做。

.......

TortoiseGit 沒有集成 Git。在 TortoiseGit 官方網站能夠下載到它。有 32bit 和 64bit 版本,同時也有中文語言包(但我不建議你安裝)。安裝完畢以後,若是你沒有安裝過 Git,那麼還須要去下載 msysGit 來安裝。由於 TortoiseGit 其實只是一個殼,它須要調用 Git 命令行才能發揮做用。(如今你知道我爲何推薦你用命令行了麼?)

爲何 TortoiseGit 不像 TortoiseSVN 同樣,把 SVN 命令行工具集成在安裝包中呢?我猜測是如下幾點緣由:

  • Git 官方從未出過 Windows 版本二進制包;
  • msysGit 和 TortoiseGit 是兩個不一樣的團隊開發的;
  • msysGit 和 TortoiseGit 的更新週期差別較大;
  • TortoiseGit 團隊但願安裝包更小;
  • TortoiseGit 團隊給用戶更靈活的選擇 Git 版本的權利。

來源:使用Git、Git GUI和TortoiseGit

3. Git 如何 Clone 非 master 分支代碼

問題描述:在從 GitHub 上 Clone 項目下來的時候,如 https 方式克隆某個具備多個分支的項目:git clone https://github.com/TeamNewPipe/NewPipe.git

注:該分支默認分支爲 dev 分支,其餘分支有 master 、multyservice 分支。

出現的問題是:克隆完畢,使用 git branch 查看本地分支,只能看到 dev 分支。若是想要是查看或是說克隆非默認分支代碼,如何操做呢?如下兩種解決方式供參考:

①第一種:

新的解決方法:先 git branch -a 列出本地和遠程全部分支,好比某個遠程分支爲 origin/daily/1.4.1,而後再直接使用 git checkout origin/daily/1.4.1

舊的解決方法:一、先在本地創建與遠程分支同名分支名稱;二、切換到該本地分支;三、創建上游分支,即 git branch --set-upstream-to=origin/daily/1.4.1 daily/1.4.1,這樣完成與上游分支的關聯,而後 pull 就行了。

參考:Git 如何 clone 非 master 分支的代碼

②第二種:

Git 默認只顯示默認分支的數據,須要手動切換到咱們須要的分支並顯示出來。

git branch
git checkout -b <本地分支名字> origin/<遠程分支名字>
複製代碼

這樣大功告成。

參考:克隆Github上項目的非Master分支

親測第二種方式是能夠的。

4. git pull 和 git fetch 有什麼區別?

首先,你的每個操做都是要指明【來源】和【目標】的,而對於 pull 來講,【目標】就是當前分支;

其次,你得清楚 Git 是有 tracking 的概念的,所謂 tracking 就是把【來源】和【目標】綁定在一塊兒,節省一些操做是須要輸入的參數。

那麼,假設你的 master 和 develop 都是 tracking 了的,因而:

  • 當你在 master 下,git pull等於 fetch origin,而後 merge origin/master
  • 當你在 develop 下,git pull等於 fetch origin,而後 merge origin/develop

參考:git pull 和 git fetch 有什麼區別?

4.2 筆記

1. 在本地倉庫初始化後,不進行 commit 提交,則新建不了分支;進行了commit提交,則真正創建了 master 分支

在某些場合,Git 會自動在本地分支與遠程分支之間,創建一種追蹤關係(tracking)。好比,在 git clone 的時候,全部本地分支默認與遠程主機的同名分支,創建追蹤關係,也就是說,本地的 master分支自動"追蹤" origin/master 分支。Git 也容許手動創建追蹤關係:git branch --set-upstream master origin/next 該命令指定 master 分支追蹤 origin/next 分支。

——來自阮一峯老師的 Git 文章。

2. 重命名本地和遠程分支名稱

在 Git 中重命名遠程分支,其實就是先刪除遠程分支,而後重命名本地分支,再從新提交一個遠程分支。

  1. 刪除分支的命令是:在 Git1.7 以後可使用這個命令 git push origin --delete <遠程分支名稱>,不然用這個也能夠:git push origin :<遠程分支名稱>表示推送一個空分支到遠程分支,其實就至關於刪除遠程分支;
  2. 重命名本地分支:git branch -m <舊名稱> <新名稱>
  3. 從新提交:git push origin <新名稱>:<新名稱>

5、Git 圖形化客戶端 SourceTree

SourceTree 是 Windows 和 Mac OS X 下免費的 Git 和 Hg 客戶端,擁有可視化界面,容易上手操做。同時它也是 Mercurial 和 Subversion 版本控制系統工具。支持建立、提交、clone、push、pull 和 merge 等操做。

SourceTree 官方下載:傳送門

Sourcetree 可簡化 Mercurial 和 Git 存儲庫的交互,讓咱們集中精力編寫代碼。經過 Sourcetree 簡單的 Git 圖形用戶界面查看和管理您的存儲庫。

  • 很是簡單,適合初學者:告別命令行 - 經過 Git 客戶端簡化分發版本的控制,快速爲每一個人提供最新信息。
  • 讓專家如虎添翼:很是適合用於提升高級用戶的工做效率。查看分支之間的變動集、stash、cherry-pick 等等。
  • 可視化代碼:眼見真的爲實。單擊一次便可獲取有關全部分支或提交的信息。
  • 桌面上的 Git 和 Hg:功能完善的圖形用戶界面,開箱即用,可提供高效、一致的開發流程。可與 Git 和 Mercurial 搭配使用。

網上的教程:

相關文章
相關標籤/搜索