656891b4c3764c7d53d09fbf44ca240f.png

Git 是一个开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目。

Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。

Git 与常用的版本控制工具 CVS, Subversion 等不同,它采用了分布式版本库的方式,不必服务器端软件支持。

入门

使用Git前,需要先建立一个仓库(repository)。您可以使用一个已经存在的目录作为Git仓库或创建一个空目录。
使用您当前目录作为Git仓库,我们只需使它初始化。

git init
使用我们指定目录作为Git仓库。

git init newrepo
从现在开始,我们将假设您在Git仓库根目录下,除非另有说明。

添加新文件

我们有一个仓库,但什么也没有,可以使用add命令添加文件。

git add filename
可以使用add... 继续添加任务文件。

提交版本

现在我们已经添加了这些文件,我们希望它们能够真正被保存在Git仓库。

为此,我们将它们提交到仓库。

git commit -m "Adding files" 

如果您不使用-m,会出现编辑器来让你写自己的注释信息。
当我们修改了很多文件,而不想每一个都add,想commit自动来提交本地修改,我们可以使用-a标识。

git commit -a -m "Changed some files" 

git commit 命令的-a选项可将所有被修改或者已删除的且已经被git管理的文档提交到仓库中。
千万注意,-a不会造成新文件被提交,只能修改。

发布版本

我们先从服务器克隆一个库并上传。
git clone ssh://example.com/~/www/project.git

现在我们修改之后可以进行推送到服务器。
git push ssh://example.com/~/www/project.git

取回更新

如果您已经按上面的进行push,下面命令表示,当前分支自动与唯一一个追踪分支进行合并。
git pull

从非默认位置更新到指定的url。
git pull http://git.example.com/project.git

删除

如何你想从资源库中删除文件,我们使用rm。
git rm file

分支与合并

分支在本地完成,速度快。要创建一个新的分支,我们使用branch命令。
git branch test

branch命令不会将我们带入分支,只是创建一个新分支。所以我们使用checkout命令来更改分支。
git checkout test

第一个分支,或主分支,被称为"master"。
git checkout master

对其他分支的更改不会反映在主分支上。如果想将更改提交到主分支,则需切换回master分支,然后使用合并。
git checkout master
git merge test

如果您想删除分支,我们使用-d标识。
git branch -d test

Git 的工作流程

一般工作流程如下:
1、克隆 Git 资源作为工作目录。
2、在克隆的资源上添加或修改文件。
3、如果其他人修改了,你可以更新资源。
4、在提交前查看修改。
5、提交修改。
在修改完成后,如果发现错误,可以撤回提交并再次修改并提交。

Git 工作区、暂存区和版本库概念

工作区:就是你在电脑里能看到的目录。
暂存区:英文叫stage, 或index。一般存放在 ".git目录下" 下的index文件(.git/index)中,所以我们把暂存区有时也叫作索引(index)。
版本库:工作区有一个隐藏目录.git,这个不算工作区,而是Git的版本库。

下面这个图展示了工作区、版本库中的暂存区和版本库之间的关系:

193f106a3e85457c28f8f4321728190b.png
图中左侧为工作区,右侧为版本库。在版本库中标记为 "index" 的区域是暂存区(stage, index),标记为 "master" 的是 master 分支所代表的目录树。

1、初始化一个git仓库

git init        //该命令执行完后在当前目录生成一个.git目录 
git init newrepo       //指定目录作为git仓库,在newrepo目录下出现一个名为.git的目录 
git add *.c 
git add README 
git commit -m"初始化项目版本”         //将目录下以.c结尾及README文件提交到仓库中

2、克隆仓库

git clone            //克隆仓库 
git clone <repo> <directory>         //克隆到指定目录 
git clone git://github.com/schacon/grit.git       //克隆ruby语言的git代码仓库grit 
git clone git://github.com/schacon/grit.git mygrit     //新建项目目录 

3、获取与创建项目命令

git init

mkdir runoob              //创建runoob项目 
cd runoob/                 
git init           //在 /www/runoob/.git/ 目录初始化空 Git 仓库完毕 

ls -a 

git clone

git clone git@github.com:schacon/simplegit.git      //克隆github上的项目 
cd simplest/           //在当前目录下生成一个simplegit目录 
ls 
ls -a 
cd .git 

4、基本快照

git add 

touch README         //添加文件README         
touch hello.php       //添加文件hello.php 
ls
git status -s       //查看项目的当前状态
git add README hello.php       //添加文件
git status        //查看上次提交之后是否有修改

git diff

执行 git diff 来查看执行 git status 的结果的详细信息. 
git diff 命令显示已写入缓存与已修改但尚未写入缓存的改动的区别。git diff 有两个主要的应用场景. 
尚未缓存的改动:git diff 
查看已缓存的改动: git diff --cached 
查看已缓存的与未缓存的所有改动:git diff HEAD 
显示摘要而非整个 diff:git diff --stat 


git add hello.php 
git status -s 
git diff —cached 

git commit 


使用 git add 命令将想要快照的内容写入缓存区, 而执行 git commit 将缓存区内容添加到仓库中。 
Git 为你的每一个提交都记录你的名字与电子邮箱地址,所以第一步需要配置用户名和邮箱地址。 
git config --global user.name ‘runoob’       //名字 
git config —-global user.email test@runoob.com        //电子邮箱 


git add hello.php 
git status -s 
git commit -m"第一次版本提交” 


Git status 


git rm


git rm hello.php      //删除文件 
ls 

git mv

git add README      
git mv README README.md    //重命名
ls

5、git分支管理

git branch      //创建分支 
git checkout    //切换分支 
git merge      //合并分支 


mkdir gitdemo 
cd gitdemo/ 
git init 
touch README 
git add README 
git commit -m"第一次版本提交” 


git branch    //列出分支 
ls
git add .
git commit -m”add test.txt”
ls
git checkout testing
ls
git checkout master
ls
git checkout -b newest
git rm test.txt
ls
touch hello.php
git add .
git commit -am"remove test.txt add runoob.php”
git checkout master


git branch   
git branch -d testing       //删除分支 
git branch  


git merge newest       //合并分支 


git checkout -b change_site       //创建change_site分支 
git commit -am”change the runoob.php" 


git checkout master 
cat runoob.php 
vim runoob.php 
cat runoob.php 


git merge change_site 
cat runoob.php 


vim runoob.php 
cat runoob.php 
git diff 


git status -s 
git add runoob.php 
git status -s 
git commit 

6、git查看提交历史

git log     //列出历史提交记录 

7、git标签

git tag -a v1.0       //给最新一次提交打上(HEAD)"v1.0"的标签。-a 选项意为"创建一个带注解的标签” 
git tag 
git tag -a <tagname> -m"runoob.com标签" 
创建分支命令:
git branch (branchname) 

切换分支命令:
git checkout (branchname) 
合并分支命令:
git merge

你可以多次合并到统一分支, 也可以选择在合并之后直接删除被并入的分支。
开始前我们先创建一个测试目录:

$ mkdir gitdemo
$ cd gitdemo/
$ git init
Initialized empty Git repository... 
$ touch README
$ git add README
$ git commit -m '第一次版本提交' 
[master (root-commit) 3b58100] 第一次版本提交 
1 file changed, 0 insertions(+), 0 deletions(-) 
create mode 100644 README 

Git 分支管理

列出分支

列出分支基本命令:
git branch
没有参数时,git branch 会列出你在本地的分支。
$ git branch
* master 
此例的意思就是,我们有一个叫做 master 的分支,并且该分支是当前分支。
当你执行 git init 的时候,缺省情况下 Git 就会为你创建 master 分支。
如果我们要手动创建一个分支。执行 git branch (branchname) 即可。
$ git branch testing
$ git branch
* master 
  testing
现在我们可以看到,有了一个新分支 testing。
当你以此方式在上次提交更新之后创建了新分支,如果后来又有更新提交, 然后又切换到了 testing 分支,Git 将还原你的工作目录到你创建分支时候的样子。
接下来我们将演示如何切换分支,我们用 git checkout (branch) 切换到我们要修改的分支。
$ ls
README
$ echo 'runoob.com' > test.txt 
$ git add . 
$ git commit -m 'add test.txt' 
[master 3e92c19] add test.txt 
1 file changed, 1 insertion(+) 
create mode 100644 test.txt 
$ ls
README        test.txt
$ git checkout testing
Switched to branch 'testing' 
$ ls
README
当我们切换到 testing 分支的时候,我们添加的新文件 test.txt 被移除了。切换回 master 分支的时候,它们有重新出现了。
$ git checkout master
Switched to branch 'master' 
$ ls
README        test.txt
我们也可以使用 git checkout -b (branchname) 命令来创建新分支并立即切换到该分支下,从而在该分支中操作。
$ git checkout -b newtest 
Switched to a new branch 'newtest' 
$ git rm test.txt
rm 'test.txt' 
$ ls
README
$ touch hello.php
$ git add . 
$ git commit -am 'removed test.txt、add runoob.php' 
[newtest c1501a2] removed test.txt、add runoob.php 
2 files changed, 1 deletion(-) 
create mode 100644 runoob.php 
delete mode 100644 test.txt 
$ ls
README        runoob.php
$ git checkout master
Switched to branch 'master' 
$ ls
README        test.txt
如你所见,我们创建了一个分支,在该分支的上移除了一些文件 test.txt,并添加了 runoob.php 文件,然后切换回我们的主分支,删除的 test.txt 文件又回来了,且新增加的 runoob.php 不存在主分支中。
使用分支将工作切分开来,从而让我们能够在不同开发环境中做事,并来回切换。

删除分支

删除分支命令:
git branch -d (branchname) 

例如我们要删除 testing 分支:
$ git branch
* master 
  testing

$ git branch -d testing 
Deleted branch testing (was 85fc7e7). 
$ git branch
* master 

分支合并

一旦某分支有了独立内容,你终究会希望将它合并回到你的主分支。 你可以使用以下命令将任何分支合并到当前分支中去:
git merge
$ git branch
* master 
  newtest
$ ls
README        test.txt
$ git merge newtest
Updating 3e92c19..c1501a2 
Fast-forward
runoob.php | 0 
test.txt   | 1 - 
2 files changed, 1 deletion(-) 
create mode 100644 runoob.php 
delete mode 100644 test.txt 
$ ls
README        runoob.php
以上实例中我们将 newtest 分支合并到主分支去,test.txt 文件被删除。
合并完后就可以删除分支:
$ git branch -d newtest 
Deleted branch newtest (was c1501a2). 
删除后, 就只剩下 master 分支了:
$ git branch
* master 

合并冲突

合并并不仅仅是简单的文件添加、移除的操作,Git 也会合并修改。
$ git branch
* master 
$ cat runoob.php
首先,我们创建一个叫做 change_site 的分支,切换过去,我们将 runoob.php 内容改为:
<?php
echo 'runoob'; 
?>
创建 change_site 分支:
$ git checkout -b change_site 
Switched to a new branch 'change_site' 
$ vim runoob.php
$ head -3 runoob.php 
<?php
echo 'runoob'; 
?>
$ git commit -am 'changed the runoob.php' 
[change_site 7774248] changed the runoob.php 
1 file changed, 3 insertions(+) 
将修改的内容提交到 change_site 分支中。 现在,假如切换回 master 分支我们可以看内容恢复到我们修改前的(空文件,没有代码),我们再次修改 runoob.php 文件。
$ git checkout master
Switched to branch 'master' 
$ cat runoob.php
$ vim runoob.php    # 修改内容如下 
$ cat runoob.php
<?php
echo 1; 
?>
$ git diff
diff --git a/runoob.php b/runoob.php 
index e69de29..ac60739 100644 
--- a/runoob.php 
+++ b/runoob.php 
@@ -0,0 +1,3 @@ 
+<?php
+echo 1; 
+?>
$ git commit -am '修改代码' 
[master c68142b] 修改代码 
1 file changed, 3 insertions(+) 
现在这些改变已经记录到我的 "master" 分支了。接下来我们将 "change_site" 分支合并过来。
$ git merge change_site
Auto-merging runoob.php
CONFLICT (content): Merge conflict in runoob.php 
Automatic merge failed; fix conflicts and then commit the result. 


$ cat runoob.php     # 代开文件,看到冲突内容 
<?php
<<<<<<< HEAD 
echo 1; 
=======
echo 'runoob'; 
>>>>>>> change_site 
?>
我们将前一个分支合并到 master 分支,一个合并冲突就出现了,接下来我们需要手动去修改它。
$ vim runoob.php
$ cat runoob.php
<?php
echo 1; 
echo 'runoob'; 
?>
$ git diff
diff --cc runoob.php 
index ac60739,b63d7d7..0000000
--- a/runoob.php 
+++ b/runoob.php 
@@@ -1,3 -1,3 +1,4 @@@ 
  <?php 
+echo 1; 
+ echo 'runoob'; 
  ?> 
在 Git 中,我们可以用 git add 要告诉 Git 文件冲突已经解决
$ git status -s 
UU runoob.php
$ git add runoob.php
$ git status -s 
M  runoob.php
$ git commit
[master 88afe0e] Merge branch 'change_site' 
现在我们成功解决了合并中的冲突,并提交了结果。
Logo

更多推荐