標籤:

學習Git(二)基本操作

Git 基礎操作

1. 創建版本庫

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

所以,創建一個版本庫非常簡單,首先,選擇一個合適的地方,創建一個空目錄:

$ mkdir learngit$ cd learngit$ pwd/Users/learngit

pwd命令用於顯示當前目錄。

如果你使用 Windows 系統,為了避免遇到各種莫名其妙的問題,請確保目錄名(包括父目錄)不包含中文。

第二步,通過git init命令把這個目錄變成 Git 可以管理的倉庫:

$ git initInitialized empty Git repository in /Users/learngit/.git/

瞬間 Git 就把倉庫建好了,而且告訴你是一個空的倉庫(empty Git repository)

ls -ah命令就可以看見當前目錄下多了一個.git的目錄,這個目錄是 Git 來跟蹤管理版本庫的,沒事千萬不要手動修改這個目錄裡面的文件,不然改亂了,就把 Git 倉庫給破壞了。

一定要放到 learngit 目錄下或子目錄下

$ git status # 隨時用git status 查看文件狀態

一個文件放到 Git 倉庫只需要兩步。

  1. 用命令git add告訴 Git,把文件添加到倉庫:

$ git add . # 把所有文件都添加到倉庫

執行上面的命令,沒有任何顯示,這就對了,Unix 的哲學是「沒有消息就是好消息」,說明添加成功。(因為沒有添加任何文件,如果添加結果不同,可以使用 git status 隨時查看 Git 狀態)

  1. 用命令git commit告訴 Git,把文件提交到倉庫:

$ git commit abc/aaa.py -m"chore:wrote a readme file"[master (root-commit) cb926e7] wrote a readme file 1 file changed, 2 insertions(+) create mode 100644 aaa.py

commit 必須遵循commit規範

**git commit規範**- feat:新功能(feature)- fix:修補bug- docs:文檔(documentation)- style: 格式(不影響代碼運行的變動)- refactor:重構(即不是新增功能,也不是修改bug的代碼變動)- test:增加測試- chore:構建過程或輔助工具的變動

2. 新機器配置 Git

  1. 創建 SSH Key。在用戶主目錄下,看看有沒有.ssh目錄,如果有,再看看這個目錄下有沒有id_rsaid_rsa.pub這兩個文件,如果已經有了,可直接跳到第2步。如果沒有,打開 Shell(Windows 下打開 Git Bash),創建 SSH Key:

$ ssh-keygen -t rsa -C "你的github郵箱"

把郵件地址換成你自己的郵件地址,一路回車,使用默認值即可,無需設置密碼。

如果一切順利的話,可以在用戶主目錄里找到.ssh目錄,裡面有 idrsa 和 idrsa.pub 兩個文件,這兩個就是 SSH Key 的秘鑰對,id_rsa是私鑰,不能泄露出去,id_rsa.pub是公鑰,可以放心地告訴任何人。

  1. 登陸 GitHub,打開「Account settings」,「SSH Keys」頁面:

然後,點「Add SSH Key」,填上任意 Title,在 Key 文本框里粘貼id_rsa.pub文件的內容:

點「Add Key」,你就應該看到已經添加的 Key

當然,GitHub 允許你添加多個 Key。假定你有若干電腦,你一會兒在公司提交,一會兒在家裡提交,只要把每台電腦的 Key 都添加到 GitHub,就可以在每台電腦上往 GitHub 推送了。

3. 關聯遠程庫

  1. 如果公司已創建該項目的遠程庫,本地還沒有,clone 該項目地址: clone with ssh

$ git clone git@github.com:xxxx/xxx.git

SSH 警告

當你第一次使用 Git 的 clone 或者 push 命令連接 GitHub 時,會得到一個警告:

The authenticity of host github.com (xx.xx.xx.xx) cant be established.

RSA key fingerprint is xx.xx.xx.xx.xx.

Are you sure you want to continue connecting (yes/no)?

這是因為 Git 使用 SSH 連接,而 SSH 連接在第一次驗證 GitHub 伺服器的 Key 時,需要你確認 GitHub 的 Key 的指紋信息是否真的來自 GitHub 的伺服器,輸入 yes 回車即可。

Git 會輸出一個警告,告訴你已經把 GitHub 的 Key 添加到本機的一個信任列表裡了:

Warning: Permanently added github.com (RSA) to the list of known hosts.

這個警告只會出現一次,後面的操作就不會有任何警告了。

  1. 如果已經在本地創建了一個 Git 倉庫後,公司也已在 GitHub 創建一個 Git 倉庫,
  • 實現讓這兩個倉庫進行遠程同步

$ git remote add origin git@github.com:xxxx/xxxx.git

  • 下一步,就可以把本地庫的所有內容推送到遠程庫上

$ git push -u origin master

把本地庫的內容推送到遠程,用git push命令,實際上是把當前分支 master 推送到遠程。

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

推送成功後,可以立刻在 GitHub 頁面中看到遠程庫的內容已經和本地一模一樣

從現在起,只要本地作了提交,就可以通過命令:

$ git push origin master

把本地master分支的最新修改推送至GitHub

  1. 一般我們在develop分支開發
    1. 如果github上沒有develop分支
  • 首先,我們在本地創建 develop 分支,然後切換到 develop 分支:

$ git checkout -b developSwitched to a new branch develop

git checkout命令加上-b參數表示創建並切換,相當於以下兩條命令:

$ git branch develop$ git checkout developSwitched to branch develop

然後,用git branch命令查看當前分支:

$ git branch* developmaster

git branch命令會列出所有分支,當前分支前面會標一個*

    • 發布develop分支

發布dev分支指的是同步develop分支的代碼到遠程伺服器

git push origin develop:develop # 這樣遠程倉庫也有一個develop分支了 或者git push origin develop # 這兩種應該都可以

  1. 如果github已經有master分支和develop分支

在本地

git checkout -b develop 新建並切換到本地develop分支

git pull origin develop 本地develop分支與遠程develop分支相關聯


Git 總結

git add . # 添加所有改動的文件到倉庫git commit 文件路徑 -mfix:修復xx bug# github上已經有master分支 和dev分支在本地git checkout -b dev # 創建+切換分支devgit pull origin dev # 本地分支與遠程分支相關聯dev# github無dev分支,在本地新建分支並推送到遠程git checkout -b devgit push origin dev:dev # 這樣遠程倉庫中也就創建了一個dev分支git branch # 查看本地有多少分支git branch 分支名字 # 創建分支git checkout dev # 切換到dev分支進行開發git push # 提交到遠程git branch -d dev # 刪除本地dev分支git merge dev # 合併dev到當前分支(master)

git remote 深入研究

git-remote - Manage set of tracked repositories

git remote [-v | --verbose]git remote add [-t <branch>] [-m <master>] [-f] [--[no-]tags] [--mirror=<fetch|push>] <name> <url>git remote rename <old> <new>git remote remove <name>git remote set-head <name> (-a | --auto | -d | --delete | <branch>)git remote set-branches [--add] <name> <branch>…git remote get-url [--push] [--all] <name>git remote set-url [--push] <name> <newurl> [<oldurl>]git remote set-url --add [--push] <name> <newurl>git remote set-url --delete [--push] <name> <url>git remote [-v | --verbose] show [-n] <name>…git remote prune [-n | --dry-run] <name>…git remote [-v | --verbose] update [-p | --prune] [(<group> | <remote>)…]

查看遠程倉庫

如果想查看你已經配置的遠程倉庫伺服器,可以運行 git remote 命令。 它會列出你指定的每一個遠程伺服器的簡寫。 如果你已經克隆了自己的倉庫,那麼至少應該能看到 origin - 這是 Git 給你克隆的倉庫伺服器的默認名字:

$ git clone https://github.com/schacon/ticgitCloning into ticgit...remote: Reusing existing pack: 1857, done.remote: Total 1857 (delta 0), reused 0 (delta 0)Receiving objects: 100% (1857/1857), 374.35 KiB | 268.00 KiB/s, done.Resolving deltas: 100% (772/772), done.Checking connectivity... done.$ cd ticgit$ git remoteorigin

你也可以指定選項 -v,會顯示需要讀寫遠程倉庫使用的 Git 保存的簡寫與其對應的 URL。

$ git remote -vorigin https://github.com/schacon/ticgit (fetch)origin https://github.com/schacon/ticgit (push)

如果你的遠程倉庫不止一個,該命令會將它們全部列出。 例如,與幾個協作者合作的,擁有多個遠程倉庫的倉庫看起來像下面這樣:

$ cd grit$ git remote -vbakkdoor https://github.com/bakkdoor/grit (fetch)bakkdoor https://github.com/bakkdoor/grit (push)cho45 https://github.com/cho45/grit (fetch)cho45 https://github.com/cho45/grit (push)defunkt https://github.com/defunkt/grit (fetch)defunkt https://github.com/defunkt/grit (push)koke git://github.com/koke/grit.git (fetch)koke git://github.com/koke/grit.git (push)origin git@github.com:mojombo/grit.git (fetch)origin git@github.com:mojombo/grit.git (push)

這樣我們可以輕鬆拉取其中任何一個用戶的貢獻。 此外,我們大概還會有某些遠程倉庫的推送許可權,雖然我們目前還不會在此介紹。

注意這些遠程倉庫使用了不同的協議;我們將會在 在伺服器上搭建 Git 中了解關於它們的更多信息。

添加遠程倉庫

運行 git remote add <shortname> <url> 添加一個新的遠程 Git 倉庫,同時指定一個你可以輕鬆引用的簡寫:

$ git remoteorigin$ git remote add pb https://github.com/paulboone/ticgit$ git remote -vorigin https://github.com/schacon/ticgit (fetch)origin https://github.com/schacon/ticgit (push)pb https://github.com/paulboone/ticgit (fetch)pb https://github.com/paulboone/ticgit (push)

現在你可以在命令行中使用字元串 pb 來代替整個 URL。 例如,如果你想拉取 Paul 的倉庫中有但你沒有的信息,可以運行 git fetch pb

$ git fetch pbremote: Counting objects: 43, done.remote: Compressing objects: 100% (36/36), done.remote: Total 43 (delta 10), reused 31 (delta 5)Unpacking objects: 100% (43/43), done.From https://github.com/paulboone/ticgit * [new branch] master -> pb/master * [new branch] ticgit -> pb/ticgit

現在 Paulmaster 分支可以在本地通過 pb/master 訪問到 - 你可以將它合併到自己的某個分支中,或者如果你想要查看它的話,可以檢出一個指向該點的本地分支。

從遠程倉庫中抓取與拉取

就如剛才所見,從遠程倉庫中獲得數據,可以執行:

$ git fetch [remote-name]

這個命令會訪問遠程倉庫,從中拉取所有你還沒有的數據。 執行完成後,你將會擁有那個遠程倉庫中所有分支的引用,可以隨時合併或查看。

如果你使用 clone 命令克隆了一個倉庫,命令會自動將其添加為遠程倉庫並默認以 「origin」 為簡寫。 所以,git fetch origin 會抓取克隆(或上一次抓取)後新推送的所有工作。 必須注意 git fetch 命令會將數據拉取到你的本地倉庫 - 它並不會自動合併或修改你當前的工作。 當準備好時你必須手動將其合併入你的工作。

如果你有一個分支設置為跟蹤一個遠程分支,可以使用 git pull 命令來自動的抓取然後合併遠程分支到當前分支。 這對你來說可能是一個更簡單或更舒服的工作流程;默認情況下,git clone 命令會自動設置本地 master 分支跟蹤克隆的遠程倉庫的 master 分支(或不管是什麼名字的默認分支)。 運行 git pull 通常會從最初克隆的伺服器上抓取數據並自動嘗試合併到當前所在的分支。

推送到遠程倉庫

當你想分享你的項目時,必須將其推送到上游。 這個命令很簡單:git push [remote-name] [branch-name]。 當你想要將 master 分支推送到 origin 伺服器時(再次說明,克隆時通常會自動幫你設置好那兩個名字),那麼運行這個命令就可以將你所做的備份到伺服器:

$ git push origin master

只有當你有所克隆伺服器的寫入許可權,並且之前沒有人推送過時,這條命令才能生效。 當你和其他人在同一時間克隆,他們先推送到上游然後你再推送到上游,你的推送就會毫無疑問地被拒絕。 你必須先將他們的工作拉取下來並將其合併進你的工作後才能推送。

查看遠程倉庫

如果想要查看某一個遠程倉庫的更多信息,可以使用 git remote show [remote-name] 命令。 如果想以一個特定的縮寫名運行這個命令,例如 origin,會得到像下面類似的信息:

$ git remote show origin* remote origin Fetch URL: https://github.com/schacon/ticgit Push URL: https://github.com/schacon/ticgit HEAD branch: master Remote branches: master tracked dev-branch tracked Local branch configured for git pull: master merges with remote master Local ref configured for git push: master pushes to master (up to date)

它同樣會列出遠程倉庫的 URL 與跟蹤分支的信息。 這些信息非常有用,它告訴你正處於 master 分支,並且如果運行 git pull,就會抓取所有的遠程引用,然後將遠程 master 分支合併到本地 master 分支。 它也會列出拉取到的所有遠程引用。

這是一個經常遇到的簡單例子。 如果你是 Git 的重度使用者,那麼還可以通過 git remote show 看到更多的信息。

$ git remote show origin* remote origin URL: https://github.com/my-org/complex-project Fetch URL: https://github.com/my-org/complex-project Push URL: https://github.com/my-org/complex-project HEAD branch: master Remote branches: master tracked dev-branch tracked markdown-strip tracked issue-43 new (next fetch will store in remotes/origin) issue-45 new (next fetch will store in remotes/origin) refs/remotes/origin/issue-11 stale (use git remote prune to remove) Local branches configured for git pull: dev-branch merges with remote dev-branch master merges with remote master Local refs configured for git push: dev-branch pushes to dev-branch (up to date) markdown-strip pushes to markdown-strip (up to date) master pushes to master (up to date)

這個命令列出了當你在特定的分支上執行 git push 會自動地推送到哪一個遠程分支。 它也同樣地列出了哪些遠程分支不在你的本地,哪些遠程分支已經從伺服器上移除了,還有當你執行 git pull 時哪些分支會自動合併。

遠程倉庫的移除與重命名

如果想要重命名引用的名字可以運行 git remote rename 去修改一個遠程倉庫的簡寫名。 例如,想要將 pb 重命名為 paul,可以用 git remote rename 這樣做:

$ git remote rename pb paul$ git remoteoriginpaul

值得注意的是這同樣也會修改你的遠程分支名字。 那些過去引用 pb/master 的現在會引用 paul/master

如果因為一些原因想要移除一個遠程倉庫 - 你已經從伺服器上搬走了或不再想使用某一個特定的鏡像了,又或者某一個貢獻者不再貢獻了 - 可以使用 git remote rm

$ git remote rm paul$ git remoteorigin

回顧:學習Git(一)起步

推薦閱讀:

如何精通C語言
編程-前端jsp頁面開發
JS中的閉包為何會產生副作用,即閉包只能取得包含函數中任何變數的最後一個值?
買西瓜的高級玩法,用好你的智能手機

TAG:Git | 編程 | 學習 |