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
說到這,估計仍是會存在部分人對 GitHub 以爲很陌生。這裏摘入網上一些文章和資料先了解和學習下吧:算法
系列文章: 從0開始學習 GitHub 系列 - stormzhang,推薦看完該系列文章。編程
如何建立項目:安全
關於 GitHub 網站:
簡單講講個人認識:首先 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 命令是學習的重點,要學的深入,最好懂得原理和本質。本文僅是我的的學習記錄,我把經常使用的命令整理和記錄在此,方便之後查找。
一、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 強制推送到遠程服務器
複製代碼
一、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 的區別說下:
- 前者能夠隨意克隆 github上的項目,而無論是誰的;然後者則是你必須是你要克隆的項目的擁有者或管理員,且須要先添加 SSH key ,不然沒法克隆。
- https url 在 push 的時候是須要驗證用戶名和密碼的;而 SSH 在 push 的時候,是不須要輸入用戶名的,若是配置 SSH key 的時候設置了密碼,則須要輸入密碼的,不然直接是不須要輸入密碼的。
關於如何添加 ssh 下面是步驟:
Linux 與 Mac 都是默認安裝了 SSH ,而 Windows 系統安裝了 Git Bash(即安裝了 Git 就有這個) 應該也是帶了 SSH 的,在終端輸入
ssh
命令能夠查看是否安裝了 ssh;緊接着輸入
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
下, 都是隱藏目錄,你們應該能找到的;注: 其實在連續安回車鍵中會提示輸入一個密碼以及確認密碼,這個密碼會在你提交項目時使用,若是爲
空
的話(即直接按回車鍵,也即未設置密碼)提交項目代碼時則不用輸入密碼;接下來要作的是把 id_rsa.pub 的內容添加到 GitHub 上(PS:如何添加自行網上搜下,就很少說了),這樣你本地的 id_rsa 密鑰跟 GitHub 上的 id_rsa.pub 公鑰進行配對,受權成功,這樣就能夠不用像 https 方式每次輸入帳號和密碼進行驗證身份才能提交了。(你就理解爲,SSH 就比如進行了身份驗證的這種理解。)
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 push
。git 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
複製代碼
一、採用 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 方式,每次須要驗證用戶身份信息。
在使用 git status
命令查看倉庫狀態如果看到: your branch is ahead of 'origin/master' by 2 commits.
,解釋下:
能夠暫時把 origin/master 簡單理解爲「中央倉庫」,也就是說,這句話是告訴你,你的本地倉庫已經領先中央倉庫兩個提交了。而後可使用 git push
提交發布至中央服務器(這裏即指 GitHub)。
由於採用的是 https 方式克隆,因此在這個過程 GitHub 會向你索要帳戶和密碼。填入正確的帳戶和密碼,push 操做就完成了。這時你再去你的 GitHub 倉庫頁面能夠看到提交記錄。說明你已經成功把本地倉庫的提交推送到了服務器了。
PS:若是以爲一遍遍地輸入密碼很煩,能夠按照 這個頁面 提供的方案來把密碼保存起來。另外還有一個更簡單但安全性低一些的方案。執行這行代碼:git config credential.helper store
,在這以後你只須要再輸入一次密碼, Git 就會把你的密碼保存下來,這以後就不再用輸入了。說它「安全性低」,是由於這條指令會讓 Git 把你的密碼以明文形式保存在你的電腦上。具體這兩種保存密碼的方案選擇哪一個,看你本身了。
總結下:
git clone
,再用 git add 文件名
把文件添加到暫存區,再用 git commit
提交;git status
來隨時查看工做目錄的狀態。每一個文件有 "changed / unstaged"(已修改), "staged"(已修改並暫存), "commited"(已提交) 三種狀態,以及一種特殊狀態 "untracked"(未跟蹤);git push
)。在擁有了一個 GitHub 帳號以後,就能夠自由的 Clone 或者下載其餘項目,也能夠建立本身的項目,可是你無法提交代碼。仔細想一想也知道,確定不可能隨意就能提交代碼的,若是隨意能夠提交代碼,那麼 GitHub 上的項目豈不亂了套了,因此提交代碼以前必定是須要某種受權的,而 GitHub 上通常都是基於 SSH 受權的。那麼什麼是 SSH 呢? 簡單點說,SSH 是一種網絡協議,用於計算機之間的加密登陸。目前是每一臺 Linux 電腦的標準配置。而大多數 Git 服務器都會選擇使用 SSH 公鑰來進行受權,因此想要在 GitHub 提交代碼的第一步就是要先添加 SSH key 配置。
添加 SSH 步驟:
ssh
查看電腦是否安裝了 ssh;ssh-keygen -t rsa
,什麼意思呢?就是指定 rsa 算法生成密鑰,接着連續三個回 車鍵(不須要輸入密碼) ,而後就會生成兩個文件 id_rsa
和 id_rsa.pub
,而 id_rsa 是密鑰,id_rsa.pub 就是公鑰。這兩文件默認分別在以下目錄裏生成: Linux/Mac 系統 在 ~/.ssh 下,Windows 系統在 /c/Documents and Settings/username/.ssh 下, 都是隱藏文件。ssh -T git@github.com
進行測試。最後就是 push、pull 的操做了。添加 SSH key 成功以後,咱們就有權限向 GitHub 上咱們本身的項目提交代碼了。執行:git push origin master
進行代碼提交。
實踐: 假設咱們本地有個 test2 的項目,咱們須要的是在 GitHub 上建一個 test 的項目,而後把本地 test2 上的全部代碼 commit 記錄提交到 GitHub 上的 test 項目。
第一步就是在 GitHub 上建一個 test 倉庫,具體怎麼操做我就很少說了吧;
第二步切換到 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 密鑰,這樣能夠省去每次都輸密碼。
對於前面這個「假設咱們本地有個 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
。
Git 自帶GUI界面。使用 git gui
命令能夠打開它。在這個界面中能夠完成 commit、merge、push、pull 等等經常使用操做。
.......
TortoiseGit 沒有集成 Git。在 TortoiseGit 官方網站能夠下載到它。有 32bit 和 64bit 版本,同時也有中文語言包(但我不建議你安裝)。安裝完畢以後,若是你沒有安裝過 Git,那麼還須要去下載 msysGit 來安裝。由於 TortoiseGit 其實只是一個殼,它須要調用 Git 命令行才能發揮做用。(如今你知道我爲何推薦你用命令行了麼?)
爲何 TortoiseGit 不像 TortoiseSVN 同樣,把 SVN 命令行工具集成在安裝包中呢?我猜測是如下幾點緣由:
問題描述:在從 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/<遠程分支名字>
複製代碼
這樣大功告成。
親測第二種方式是能夠的。
首先,你的每個操做都是要指明【來源】和【目標】的,而對於 pull 來講,【目標】就是當前分支;
其次,你得清楚 Git 是有 tracking 的概念的,所謂 tracking 就是把【來源】和【目標】綁定在一塊兒,節省一些操做是須要輸入的參數。
那麼,假設你的 master 和 develop 都是 tracking 了的,因而:
git pull
等於 fetch origin,而後 merge origin/mastergit pull
等於 fetch origin,而後 merge origin/develop參考:git pull 和 git fetch 有什麼區別?
在某些場合,Git 會自動在本地分支與遠程分支之間,創建一種追蹤關係(tracking)。好比,在 git clone 的時候,全部本地分支默認與遠程主機的同名分支,創建追蹤關係,也就是說,本地的 master分支自動"追蹤" origin/master 分支。Git 也容許手動創建追蹤關係:git branch --set-upstream master origin/next
該命令指定 master 分支追蹤 origin/next 分支。
——來自阮一峯老師的 Git 文章。
在 Git 中重命名遠程分支,其實就是先刪除遠程分支,而後重命名本地分支,再從新提交一個遠程分支。
git push origin --delete <遠程分支名稱>
,不然用這個也能夠:git push origin :<遠程分支名稱>
表示推送一個空分支到遠程分支,其實就至關於刪除遠程分支;git branch -m <舊名稱> <新名稱>
;git push origin <新名稱>:<新名稱>
。SourceTree 是 Windows 和 Mac OS X 下免費的 Git 和 Hg 客戶端,擁有可視化界面,容易上手操做。同時它也是 Mercurial 和 Subversion 版本控制系統工具。支持建立、提交、clone、push、pull 和 merge 等操做。
SourceTree 官方下載:傳送門。
Sourcetree 可簡化 Mercurial 和 Git 存儲庫的交互,讓咱們集中精力編寫代碼。經過 Sourcetree 簡單的 Git 圖形用戶界面查看和管理您的存儲庫。
網上的教程: