Git整理

1. 版本控制

CVS及SVN都是集中式的版本控制系統而Git是分布式版本控制系統。

  1. 集中式版本控制系統,版本庫是集中存放在中央服務器的,而干活的時候,用的都是自己的電腦,所以要先從中央服務器取得最新的版本,然后開始干活,干完活了,再把自己的活推送給中央服務器。
  2. 分布式版本控制系統根本沒有“中央服務器”,每個人的電腦上都是一個完整的版本庫。分布式版本控制系統通常也有一臺充當“中央服務器”的電腦,方便“交換”大家的修改。

2. 安裝Git

在Mac OS X上安裝Git,有兩種安裝Git的方法。

  1. 安裝homebrew,然后通過homebrew安裝Git,具體方法請參考homebrew的文檔:http://brew.sh/
  2. 直接從AppStore安裝Xcode,Xcode集成了Git,不過默認沒有安裝,你需要運行Xcode,選擇菜單“Xcode”->“Preferences”,在彈出窗口中找到“Downloads”,選擇“Command Line Tools”,點“Install”就可以完成安裝了。安裝了 XCode 集成了 git, 就可以直接在終端使用。
  • git版本
    git --version git version 2.11.0 (Apple Git-81)

  • 配置列表:
    git config --list
    注意: 當前路徑的git配置

  • 在終端配置,安裝完成之后需要在終端中配置一下

      $git config --global user.name "your name"
      $git config --global user.email "your email"
    

    注意: git config 命令的--global 參數,使用這個參數表示當前使用的這臺機器上的 git 倉庫都會使用這個配置,當然可以對某個參數指定不同的username 和 email。
    每個倉庫的Git配置文件都放在.git/config文件中
    cat .git/config 當前倉庫配置
    cat .gitconfig 主目錄下 用戶配置

git config --global alias.st status 配置別名(刪除,進入配置文件刪除)
git config --global alias.lg "log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit"

3. 創建版本庫

版本庫又名倉庫,英文名repository,你可以簡單理解成一個目錄,這個目錄里 面的所有文件都可以被Git管理起來,每個文件的修改、刪除,Git都能跟蹤,以便任何時刻都可以追蹤歷史,或者在將來某個時刻可以“還原”。

1.創建一個目錄 并進入到該目錄下

mkdir test
cd test

2.初始化這個目錄,變成可以管理的倉庫

git init

3.添加文件到Git倉庫,分兩步:
第一步,使用命令git add <file>,注意,可反復多次使用,添加多個文件;
git add . ("."表示添加當前目錄下所有的可提交的文件)
第二步,使用命令git commit,完成。
git commit命令,-m后面輸入的是本次提交的說明,可以輸入任意內容,當然最好是有意義的,這樣你就能從歷史記錄里方便地找到改動記錄。
4.工作區和暫存區
工作區:電腦里能看到的目錄,比如我的git文件夾。
版本庫(Repository):工作區有一個隱藏目錄.git,這個不算工作區,而是Git的版本庫。
暫存區:Git的版本庫里存了很多東西,其中最重要的就是稱為stage(或者叫index)。
git add把要提交的所有修改添加到暫存區。
git commit把暫存區的所有內容提交到當前分支。
git status命令可以讓我們時刻掌握工作區當前的狀態,告訴你有文件被修改過。
git diff可以查看工作區的修改內容。
5.日志記錄

  • 查看提交歷史,以便確定要回退到哪個版本:
    git log命令顯示從最近到最遠的提交日志(當前到最遠的記錄,如重返過去)。
    如果輸出的信息太多,可以加上 --pretty=oneline 參數。
    顯示的 hash 值太長可以加上 --abbrev-commit 。
    需要查看歷史合并記錄 加上 --graph。
    git log --abbrev-commit --pretty=oneline --graph
  • 查看命令歷史,以便確定要回到未來的哪個版本(重返未來)
    Git提供了一個命令用來記錄你的每一次命令:git reflog

6.版本回退穿梭

Git必須知道當前版本是哪個版本,在Git中,用HEAD表示當前版本,上一個版本就是HEAD^, 上上一個版本就是HEAD^^,當然往上100個版本寫100個^比較容易數不過來,所以寫成HEAD~100。

Git允許我們在版本的歷史之間穿梭,使用命令git reset --hard commit_id

commit id(版本號),和SVN不一樣,Git的commit id不是1,2,3……遞增的數字,而是一個SHA1計算出來的一個非常大的數字,用十六進制表示。

7.撤銷修改

  • git checkout -- file可以丟棄工作區的修改
    一種是readme.txt自修改后還沒有被放到暫存區,現在,撤銷修改就回到和版本庫一模一樣的狀態;
    一種是readme.txt已經添加到暫存區后,又作了修改,現在,撤銷修改就回到添加到暫存區后的狀態。
  • git checkout -- file命令中的--很重要,沒有--,就變成了“切換到另一個分支”的命令,(分支管理)。
  • git reset HEAD file可以把暫存區的修改撤銷掉(unstage),重新放回工作區
    用命令git add告訴Git,把文件添加到倉庫:
  • 沒提交遠程之前,版本回退。

4. 遠程倉庫

  • GitHub倉庫(免費托管的Git倉庫,任何人都可以看)
    1.本地Git倉庫和GitHub倉庫之間的傳輸是可以通過SSH加密的。
    2.Https
    第1步:創建SSH Key。ssh-keygen -t rsa -C "youremail@example.com"
    順利的話,可以在用戶主目錄里找到.ssh目錄,里面有id_rsa和id_rsa.pub兩個文件,這兩個就是SSH Key的秘鑰對,id_rsa是私鑰,不能泄露出去,id_rsa.pub是公鑰,可以放心地告訴任何人。
    第2步: 對接GitHub。
  • Team Foundation Server(tfs)
    本地Git倉庫和tfs倉庫之間的傳輸也是可以通過SSH加密的。
  • 自己搭Git服務器

5. 添加遠程倉庫

在本地的xxx倉庫下運行命令:
https:
git remote add origin2 https://github.com/JinXiangHuang/xxx.git
SSH密鑰對(速度最快):
git remote add origin git@github.com:JinXiangHuang/xxx.git
branch.master.remote=origin 遠程倉庫名
branch.master.merge=refs/heads/master 支線

  • 推:
    關聯后,把本地庫的內容推送到遠程,使用命令git push -u origin master第一次推送master分支的所有內容到遠程;

    由于遠程庫是空的,我們第一次推送master分支時,加上了-u參數,Git不但會把本地的master分支內容推送的遠程新的master分支,還會把本地的master分支和遠程的master分支關聯起來,在以后的推送或者拉取時就可以簡化命令。

    此后,每次本地提交后,只要有必要,就可以使用命令git push origin master推送最新修改。

  • 拉:
    默認情況下 git pull 只會抓取遠程最新的代碼,并不會合并到當前分支。
    我們希望每次 git pull如果有最新的希望直接幫我們合并到當前的分支,打開配置文件, vi .git/config 最后面添加branch "master"
    remote = origin
    merge = refs/heads/master
    也可添加其他分支,但是即使添加多個分支,git 只會幫我們合并當前分支,其他分支需要手動合并 git merge origin/develop

  • 從遠程克隆
    git clone git@github.com: JinXiangHuang/xxx.git

示例1:先創建遠程庫,然后,從遠程庫克隆。
1.git clone git@github.com:JinXiangHuang/someFiles.git
2.add commit ...
3.命令git push -u origin master第一次推送master分支的所有內容;此后,每次本地提交后,只要有必要,就可以使用命令git push origin master推送最新修改;
示例2:先有本地庫(是否有README.md),后有遠程庫的時候,如何關聯遠程庫。

error: failed to push some refs to 'git@github.com:JinXiangHuang/someFiles.git'
hint: Updates were rejected because the remote contains work that you do
hint: not have locally. This is usually caused by another repository pushing
hint: to the same ref. You may want to first integrate the remote changes
hint: (e.g., 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.
需要echo,add README.md

echo "# someFiles" >> README.md
git init
git add README.md
git commit -m "first commit"
git remote add origin https://github.com/JinXiangHuang/someFiles.git
git push -u origin master

6. 創建與合并分支

git checkout命令加上-b參數git checkout -b dev表示創建并切換,相當于以下兩條命令:
創建:git branch dev
切換:git checkout dev
查看分支:git branch,列出所有分支,當前分支前面會標一個*號
把dev分支的工作成果合并到master分支上:
合并指定分支到當前分支:git merge dev
刪除dev分支:git branch -d dev
強行刪除:git branch -D <name>
重命名分支:git branch -m dev develop2
刪除遠程分支:git push origin --delete develop2

解決沖突:Automatic merge failed; fix conflicts and then commit the result.!!!!!
Git告訴我們,xxx文件存在沖突,必須手動解決沖突后再提交。git status也可以告訴我們沖突的文件。
用<<<<<<<,=======,>>>>>>>標記出不同分支的內容
切換分支,分支提交,切換主支主支提交后,存在沖突。
當Git無法自動合并分支時,就必須首先解決沖突。解決沖突后,再提交,合并完成。
分支的合并情況:
git log --graph --pretty=oneline --abbrev-commit
git log --pretty=oneline --abbrev-commit

通常,合并分支時,如果可能,Git會用Fast forward模式,但這種模式下,刪除分支后,會丟掉分支信息。 如果要強制禁用Fast forward模式,Git就會在merge時生成一個新的commit,這樣,從分支歷史上就可以看出分支信息。
合并分支時,加上--no-ff參數就可以用普通模式合并表示禁用Fast forward,合并后的歷史有分支,能看出來曾經做過合并,而fast forward合并就看不出來曾經做過合并。

Bug分支:
修復bug時,我們會通過創建新的bug分支進行修復,然后合并,最后刪除;
當手頭工作沒有完成時,先把工作現場git stash一下,然后去修復bug,修復后,再git stash pop,回到工作現場。
git stash,把當前工作區“儲藏”起來。
git stash list多次stash,恢復的時候,先用git stash list查看,然后恢復指定的stash
git stash apply恢復一恢復后,stash內容并不刪除,你需要用git stash drop來刪除;
git stash pop恢復的同時把stash內容也刪了.

git push origin dev git push origin xxx
master分支是主分支,因此要時刻與遠程同步;
dev分支是開發分支,團隊所有成員都需要在上面工作,所以也需要與遠程同步;
bug分支只用于在本地修復bug,就沒必要推到遠程了,除非老板要看看你每周到底修復了幾個bug;
feature分支是否推到遠程,取決于你是否和你的小伙伴合作在上面開發。

7. 標簽

git tag v2切換到需要打標簽的分支上,git tag xxx就可以打一個新標簽.默認標簽是打在最新提交的commit上的。
git tag -a v0.1 -m "version 0.1 released" 3628164創建帶有說明的標簽,用-a指定標簽名,-m指定說明文字。
git tag查看所有標簽.
git show v2查看標簽信息。
git push origin <tagname>可以推送一個本地標簽;
git push origin --tags可以推送全部未推送過的本地標簽;
git tag -d <tagname>可以刪除一個本地標簽;
git push origin :refs/tags/<tagname>可以刪除一個遠程標簽。

相關

顯示隱藏文件 defaults write com.apple.finder AppleShowAllFiles Yes && killall Finder
不顯示隱藏文件 defaults write com.apple.finder AppleShowAllFiles No && killall Finder
建議用命令復制ssh key,用文本軟件打開有可能出錯!
mac
pbcopy < ~/.ssh/id_rsa.pub
windows
clip < ~/.ssh/id_rsa.pub
linux
sudo apt-get install xclip
xclip -sel clip < ~/.ssh/id_rsa.pub

No such file or directory 創建SSH Key:
ssh-keygen -t rsa -C "youremail@example.com"
用戶主目錄里找到.ssh目錄,里面有id_rsa和id_rsa.pub兩個文件,這兩個就是SSH Key的秘鑰對,id_rsa是私鑰,不能泄露出去,id_rsa.pub是公鑰

如何把項目托管到GitHub

在github上面建立空的倉庫(repositories)

Initialize this repository with a README 表示在初始化倉庫的時候,是否生成一個readMe文件。我們在查看別人框架的時候,在框架主頁上會有對該框架版本信息,作用使用方法等等的介紹,這個文件就是readMe文件,在這里選擇勾上。

Add .gitignore按鈕,點擊之后會出現一個下拉框,問你是否要設置倉庫的忽略文件。這個看你自己的需要,通常如果你的倉庫和代碼項目有關系,那么最好選擇相應的忽略文件(如OC項目可以選擇Object-C,swift項目可以選擇Swift),至于為什么請參考GIT的基本使用。

Add a license按鈕,點擊之后會出現一個下拉框,需要你選擇一種開源協議,開源協議有很多種用的比較多的有MIT的或者是Apache的,不同的開源協議對項目的使用方式等有不同的規定,詳情可以參考Choose an open source license。

廖雪峰的官方網站
Git官網
Git權威指南電子版下載地址
https://git-scm.com/book/zh/v2

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,505評論 6 533
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,556評論 3 418
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,463評論 0 376
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,009評論 1 312
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,778評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,218評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,281評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,436評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,969評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,795評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,993評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,537評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,229評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,659評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,917評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,687評論 3 392
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,990評論 2 374

推薦閱讀更多精彩內容

  • git常用命令 GIT常用命令備忘:http://stormzhang.com/git/2014/01/27/gi...
    新篇章閱讀 8,529評論 1 26
  • 1. 安裝 Github 查看是否安裝git: $ git config --global user.name "...
    Albert_Sun閱讀 13,691評論 9 163
  • 小托夫閱讀 975評論 6 14
  • 在你的生活中,你有沒有做過一些烏龍的事情呢?讓你自己哭笑不得的,讓家人哭笑不得的?也許你夠機靈夠醒目,沒有做過這樣...
    青鸞gl閱讀 423評論 0 1
  • 1復習:問題本身不是問題,怎樣應對才是問題,心理營養 永遠不要和生活對抗,因為贏的永遠是生活。 孩子所有的問題是自...
    秦聰1閱讀 361評論 0 0