一個例子玩明白GIT
GIT的介紹和教程五花八門,但實際需要用的就是建倉、推送、拉取等操作,這兒咱可以通過一個例子熟悉這些操作,一次性搞定GIT的使用方法學習。下面這個例子的內容是內容是建立初始版本庫,然后將數據復制到 "遠程 "版本庫。
開始建倉
創建目錄/tmp/example
,用于這個例子的練習
$ mkdir /tmp/example
$ cd /tmp/example
在這個目錄初始化git
倉庫
$ git init
Initialized empty Git repository in /tmp/example/.git/
創建一個文件RADME.txt
$ echo "Hello, world" > README.txt
用git add filename
把README.txt
添加到倉庫中
$ git add README.txt # Similar to Team -> Add to Version Control
$ # git commit # Would prompt for message
用git commit
把之前的操作從緩存提交到倉庫,-m
后跟上這次提交的說明,每次提交相當于一個暫時的版本,會有唯一的編號,一般工作中會在完成一部分功能或者修改一部分源文件認為需要存檔時提交一次。
$ git commit -m "Added README.txt"
[master (root-commit) 0dd1f35] Added README.txt1 files changed, 1 insertions(+), 0 deletions(-)create mode 100644 README.txt
到這兒我們就有了一個倉庫,里面提交了README.txt
文件的初始版本。
更新倉庫
現在我們看后續的更改如何提交的倉庫
先修改README.txt
文件
$ echo "Hello, solar system" > README.txt
然后提交,由于倉庫里已經包含README.txt
文件了,不需要再用git add filename
把README.txt
添加到倉庫中,-a
表示提交所有更改
$ git commit -a -m "Updated README.txt"
[master 9b1939a] Updated README.txt1 files changed, 1 insertions(+), 1 deletions(-)
$ git log --graph --oneline # Shows graph nodes (not much here) and change info
* 9b1939a Updated README.txt
* 0dd1f35 Added README.txt
創建分支
有時候需要做大的改動,要對源文件做多處修改,希望測試后再更新到倉庫,這個修改過程中的版本控制可以在新的分支中進行,待分支任務完成后再合并到主線任務中
使用git checkout -b branchname
創建并切換到新的分支,這里新的分支名是french
$ git checkout -b french 0dd1f35
Switched to a new branch 'french'
在新分支中查看并修改文件README.txt
,這個修改不會影響主線分支存儲的文件內容
$ cat README.txt
Hello, world
$ echo "Bonjour, tout le monde" > README.txt
用git add filename
把README.txt
添加到french
分支倉庫中
$ git add README.txt # or commit -a
$ git commit -m "Ajouté README.txt"
[french 66a644c] Ajouté README.txt1 files changed, 1 insertions(+), 1 deletions(-)
用git log --graph --oneline
查看修改記錄
$ git log --graph --oneline
* 66a644c Ajouté README.txt
* 0dd1f35 Added README.txt
再新建一個分支web
$ git checkout -b web 0dd1f35
$ echo '<a href="http://git.eclipse.org">git.eclipse.org</a>' > index.html
在分支web
中添加文件index.html
$ git add index.html
$ git commit -m "Added homepage"
[web d47e30c] Added homepage1 files changed, 1 insertions(+), 0 deletions(-)create mode 100644 index.html\
合并分支
用git checkout branchname
切換回mater分支,也就是我們的主線任務倉庫
$ git checkout master
用git branch
查看我們的任務倉庫里有哪些分支,前面標*的分支是我們當前所在的分支
$ git branch # See what branches we've gotfrench
* masterweb
合并web
分支到當前分支
$ git merge web
Merge made by recursive.index.html | 1 +1 files changed, 1 insertions(+), 0 deletions(-)create mode 100644 index.html
切換到french
分支,合并web
分支到french
分支
$ git checkout french
Switched to branch 'french'
$ git merge web
Merge made by recursive.index.html | 1 +1 files changed, 1 insertions(+), 0 deletions(-)create mode 100644 index.html
查看french
分支的版本記錄
$ git log --graph --oneline
* e974231 Merge branch 'web' into french
|\
| * d47e30c Added homepage
* | 66a644c Ajouté README.txt
|/
* 0dd1f35 Added README.txt
$ git checkout master
$ git log --graph --oneline
* e3de4de Merge branch 'web'
|\
| * d47e30c Added homepage
* | 9b1939a Updated README.txt
|/
* 0dd1f35 Added README.txt
推送到遠程倉庫
多人協作的情況下,除了本地倉庫以外應該還有一個共享的遠程倉庫,本地修改推送到遠程倉庫實現協作。這里我們用一個本地目錄充當遠程倉庫,實際情況的操作與此類似
遠程倉庫的core.bare
屬性應該是true
,這樣才能推送(push
)到這個倉庫
$ mkdir /tmp/other;cd /tmp/other;
$ git init
$ cd /tmp/other;git config --bool core.bare true
Initialized empty Git repository in /tmp/other/.git/
在本地添加遠程倉庫的路徑,命名為other
,實際情況路徑可以是URL
$ git remote add other /tmp/other # could be a URL over http/git
把master
分支推送到遠程倉庫other
$ git push other master # push branch 'master' to remote repository 'other'
Counting objects: 11, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (7/7), done.
Writing objects: 100% (11/11), 981 bytes, done.
Total 11 (delta 1), reused 0 (delta 0)
Unpacking objects: 100% (11/11), done.
To /tmp/other* [new branch] master -> master
把所有的分支推送到遠程倉庫
$ git push --all other # Push all branches to 'other'
Counting objects: 8, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (3/3), done.
Writing objects: 100% (5/5), 567 bytes, done.
Total 5 (delta 0), reused 0 (delta 0)
Unpacking objects: 100% (5/5), done.
To /tmp/other* [new branch] french -> french* [new branch] web -> web
結尾
完事兒,懶得寫了