关于GIT ,作用就不怎么介绍,网上搜索有很多的
一:基本命令(针对个人文档的管理)
1.创建一个版本库 ---使用本地的版本库
$ mkdir myDir
$ cd myDir
$ git-init-db
Initialized empty Git repository in .git/
创建工作目录 myDir,进入工作目录,并初始化版本库。此时会在myDir/目录下生成一个名为.git的目录,里边有三个文件,分别是存放指向项目当前分支索引信息的HEAD文件、包含项目所有对象的object子目录、保存指向对象索引的refs目录
.git/
├─branches
├─hooks
├─info
├─objects
│ ├─info
│ └─pack
├─refs
│ ├─heads
│ └─tags
└─remotes
2. 在使用 Git 之前,你需要面对 Git 来一番自我介绍。 不喜欢Git不愿透漏姓名的人,因为它要求每个人在向仓库提交数据时,
都应当承担一定的责要向 Git 进行自我介绍。说白了就是用git-log 时,能方便知道是谁修改的东西。
$ git-config user.name "yin kaizhong"
$ git-config user.email yinkaizhong@gmail.com
注意,这会在当前repository目录下的.git/config中写入配置信息。 如果git-config加了--global
选项,配置信息就会写入到~/.gitconfig文件中。 因为你可能用不同的身份参与不同的项目,而多个
项目都用git管理,所以建议不用--global配置。
2.植入内容跟踪信息
$ echo "new world" > newfile
$ git-add newfile
创建新文件newfile,写入"new world",并用git-add命令将此文件加入到版本库文件索引当中。 ]
3.提交内容到版本库
$ git-commit -m "add newfile" newfile
Created initial commit 5ce224d: add newfile
1 files changed, 2 insertions(+), 0 deletions(-)
create mode 100644 newfile
把前面的修改提交到版本库中,前提是已经用git-add命令把此文件加入到版本库文件索引当中。
也就是说必须先执行git-add , 在执行 git-commit
git-add 命令通常能够判断出当前目录 (包括其子目录) 下用户所添加的新文,
git-commit 命令的 -a 选项可将所有被修改的文档, 并将其信息追加到索引中。
或者已删除的文档的当前状态提交倒仓库中。
记住, 如果只是修改或者删除了已被Git 管理的文档,是没必要使用 git-add 命令的。
如果当前修改的文件太多,又不想一个个的执行git-add ,git-commit
可以这样:git-add . //add所有的
git-commit -a -m "message" // -a:all 的意思
4.查看当前的工作
git-status可查看当前分支状态,git-diff查看当前分支更改情况
5.分支的使用
$git-branch mybranch
$ git-checkout mybranch
Switched to branch "mybranch"
$ git-branch -D mybranch
Deleted branch mybranch.
创建名为mybranch的分支,并把以后工作转移到这个分支上开展。git-branch带-D选项为删除指定的分支,不能删除用户所在当前分支,必须用git-checkout切换到其他分支才行
6.查看项目的发展变化和比较差异
git-show-branch用来列出当前版本库中的所有分支,
git-whatchanged可以列出项目开发中的修改历史。
git-dff mybranch是来比较当前分支与mybranch分支的差异的,
当然也可使用 git-diff mybranch anotherbranch对任意两个分支做对比。
7.合并两个分支
$ git-checkout master
$ git-merge "Merge work in mybranch" mybranch
切换到master分支,并把mybranch上的工作合并到master上来。此时有可能有冲突无法合并,会给出警告,用户可根据提示手动合并一些文件
8.逆转与恢复
git-reset [--mixed | --soft | --hard] [<commit-ish>]
--mixed 只撤销掉index中的commit,却保留那个commit对应的内容
--hard index和working dir全撤销,也就是commit消失,并且其内容也消失
--soft index和working dir都不动,只"require them to be in a good order" (
这是man git-reset中的话,什么意思?) 。这会让该commit修改的文件变
成"dded but not yet committed"的状态。
例子分析:
git-reset --soft HEAD^ 逆转上次提交的版本进度
git-reset --hard 7182ae4912487692d4f91ded1e74d99e0fc12e49 强行逆转到索引指定的版本,--hard选项要慎重使用,有事可能破坏正常文件。
git-revert 也可撤销上次对版本库的提交,但这本身也会产生一个commit,用得多了会使log看起来不那么干净
注意:1) git-reset和git-revert不同,后者是把补丁作为另一个commit反向打入tree中,而reset是真正的撤销;
2) 如果撤销最近的n次commits,就用git-reset HEAD~<n>,例如HEAD~2
删除文件:
$ git -rm aa.c
$ git -commit
恢复删除了的文件:(撤消一次提交)
$ git -log //注意查看上次 git -rm后的 git -commit ID
$ git -revert adb2f08089edac8bf1912a618a74485ab42f2b86 //指定导致删除操作的commit ID,进行撤消
二:Git 协同工作
A:服务器 ip: 192.168.4.200 且已有初始版本库cq8401.git,目录:/project/cq8401.git,有3个用户A,B,C;一个组A; B,C 属于组A,
且只有A对/project/cq8401.git 可写的权限
B:clone端 ip: 192.168.4.181
C:clone端 ip: 192.168.4.110
1.克隆远程版本库
命令:
$git-clone B@192.168.4.200:/project/cq8401.git [dir name]
[dir name]是你想让这个仓库叫什么名字。 如果不指定,就会等同于目标仓库的名字。
B: $git-clone B@192.168.4.200:/project/cq8401.git
//克隆远程版本库cq8401.git 到B机器的当前目录,目录名字为cq8401.git
C: $git-clone B@192.168.4.200:/project/cq8401.git C-cq8401
//克隆远程版本库cq8401.git 到C机器的当前目录,目录名字为C-cq8401
2.B,C 在下载下来的本地版本库中作改动(添加,删除,修改…………)
B: $echo "B first" > 1.txt
$git-add 1.txt
$git-commit 1.txt -m "add 1.txt by B"
C: $echo "C first" > 2.txt
$git-add 1.txt
$git-commit 2.txt -m "add 2.txt by C"
3.更新远端服务器A上的版本库
方法一:
先接触两个命令:
$ git-push kongjianjun@127.0.0.1:/srv/git/pigeons.git master:master
将同步本地版本库中master分支同步到远程服务器上版本库的master分支
$ git-pull kongjianjun@127.0.0.1:/srv/git/pigeons.git master:master
将远程服务器上的版本库中的master分支同步到本地版本库的master分支
而且git-pull=git-fetch+git-merge
具体操作:$git-fetch origin //克隆上游版本库
$git-merge HEAD origin //合并分支
OK 现在对B,C操作
B:
$git-pull //push前先更新一下本地的版本库,因为可能在B更新之前,C 或者其他的 用户已经向服务器A push 了代码
$ git-push A@192.168.4.200:/project/cq8401.git master:master
//将同步本地版本库中master分支同步到远程服务器A上版本库的master分支
C: 操作同上
方法二:
还有一种方法,就是A 打上B,C传过来的补丁
在B,C上
$ git-fetch origin (1) 更新 origin 分支,防止 origin 分支不是最新的公共版本,产生错误的补丁文件;
$ git-rebase origin (2) 将你在 master 上提交的工作迁移到新的源版本库的状态的基础上
$ git-format-patch origin (3)生成补丁文件
通过email或者其他方式传给A (当然这种库不适合空仓库,即是用命令:git-init --bare --shared创建的库)
在A 上
$ git-mailinfo msg patch < xxx.patch
分析邮件,把commit log写到msg文件,补丁写到patch文件。 其他信息打印到标准输出
$ git-am xxx.patch
打上补丁
4. A 作为管理员,有必要每隔一段时间对代码量大小进行维护
为版本库打包
$ git-repack
将对象打包,并保存在 .git/objects/pack 目录当中
$ git-prune-packed
清楚那些已经被打过包的原始的对象
一:基本命令(针对个人文档的管理)
1.创建一个版本库 ---使用本地的版本库
$ mkdir myDir
$ cd myDir
$ git-init-db
Initialized empty Git repository in .git/
创建工作目录 myDir,进入工作目录,并初始化版本库。此时会在myDir/目录下生成一个名为.git的目录,里边有三个文件,分别是存放指向项目当前分支索引信息的HEAD文件、包含项目所有对象的object子目录、保存指向对象索引的refs目录
.git/
├─branches
├─hooks
├─info
├─objects
│ ├─info
│ └─pack
├─refs
│ ├─heads
│ └─tags
└─remotes
2. 在使用 Git 之前,你需要面对 Git 来一番自我介绍。 不喜欢Git不愿透漏姓名的人,因为它要求每个人在向仓库提交数据时,
都应当承担一定的责要向 Git 进行自我介绍。说白了就是用git-log 时,能方便知道是谁修改的东西。
$ git-config user.name "yin kaizhong"
$ git-config user.email yinkaizhong@gmail.com
注意,这会在当前repository目录下的.git/config中写入配置信息。 如果git-config加了--global
选项,配置信息就会写入到~/.gitconfig文件中。 因为你可能用不同的身份参与不同的项目,而多个
项目都用git管理,所以建议不用--global配置。
2.植入内容跟踪信息
$ echo "new world" > newfile
$ git-add newfile
创建新文件newfile,写入"new world",并用git-add命令将此文件加入到版本库文件索引当中。 ]
3.提交内容到版本库
$ git-commit -m "add newfile" newfile
Created initial commit 5ce224d: add newfile
1 files changed, 2 insertions(+), 0 deletions(-)
create mode 100644 newfile
把前面的修改提交到版本库中,前提是已经用git-add命令把此文件加入到版本库文件索引当中。
也就是说必须先执行git-add , 在执行 git-commit
git-add 命令通常能够判断出当前目录 (包括其子目录) 下用户所添加的新文,
git-commit 命令的 -a 选项可将所有被修改的文档, 并将其信息追加到索引中。
或者已删除的文档的当前状态提交倒仓库中。
记住, 如果只是修改或者删除了已被Git 管理的文档,是没必要使用 git-add 命令的。
如果当前修改的文件太多,又不想一个个的执行git-add ,git-commit
可以这样:git-add . //add所有的
git-commit -a -m "message" // -a:all 的意思
4.查看当前的工作
git-status可查看当前分支状态,git-diff查看当前分支更改情况
5.分支的使用
$git-branch mybranch
$ git-checkout mybranch
Switched to branch "mybranch"
$ git-branch -D mybranch
Deleted branch mybranch.
创建名为mybranch的分支,并把以后工作转移到这个分支上开展。git-branch带-D选项为删除指定的分支,不能删除用户所在当前分支,必须用git-checkout切换到其他分支才行
6.查看项目的发展变化和比较差异
git-show-branch用来列出当前版本库中的所有分支,
git-whatchanged可以列出项目开发中的修改历史。
git-dff mybranch是来比较当前分支与mybranch分支的差异的,
当然也可使用 git-diff mybranch anotherbranch对任意两个分支做对比。
7.合并两个分支
$ git-checkout master
$ git-merge "Merge work in mybranch" mybranch
切换到master分支,并把mybranch上的工作合并到master上来。此时有可能有冲突无法合并,会给出警告,用户可根据提示手动合并一些文件
8.逆转与恢复
git-reset [--mixed | --soft | --hard] [<commit-ish>]
--mixed 只撤销掉index中的commit,却保留那个commit对应的内容
--hard index和working dir全撤销,也就是commit消失,并且其内容也消失
--soft index和working dir都不动,只"require them to be in a good order" (
这是man git-reset中的话,什么意思?) 。这会让该commit修改的文件变
成"dded but not yet committed"的状态。
例子分析:
git-reset --soft HEAD^ 逆转上次提交的版本进度
git-reset --hard 7182ae4912487692d4f91ded1e74d99e0fc12e49 强行逆转到索引指定的版本,--hard选项要慎重使用,有事可能破坏正常文件。
git-revert 也可撤销上次对版本库的提交,但这本身也会产生一个commit,用得多了会使log看起来不那么干净
注意:1) git-reset和git-revert不同,后者是把补丁作为另一个commit反向打入tree中,而reset是真正的撤销;
2) 如果撤销最近的n次commits,就用git-reset HEAD~<n>,例如HEAD~2
删除文件:
$ git -rm aa.c
$ git -commit
恢复删除了的文件:(撤消一次提交)
$ git -log //注意查看上次 git -rm后的 git -commit ID
$ git -revert adb2f08089edac8bf1912a618a74485ab42f2b86 //指定导致删除操作的commit ID,进行撤消
二:Git 协同工作
A:服务器 ip: 192.168.4.200 且已有初始版本库cq8401.git,目录:/project/cq8401.git,有3个用户A,B,C;一个组A; B,C 属于组A,
且只有A对/project/cq8401.git 可写的权限
B:clone端 ip: 192.168.4.181
C:clone端 ip: 192.168.4.110
1.克隆远程版本库
命令:
$git-clone B@192.168.4.200:/project/cq8401.git [dir name]
[dir name]是你想让这个仓库叫什么名字。 如果不指定,就会等同于目标仓库的名字。
B: $git-clone B@192.168.4.200:/project/cq8401.git
//克隆远程版本库cq8401.git 到B机器的当前目录,目录名字为cq8401.git
C: $git-clone B@192.168.4.200:/project/cq8401.git C-cq8401
//克隆远程版本库cq8401.git 到C机器的当前目录,目录名字为C-cq8401
2.B,C 在下载下来的本地版本库中作改动(添加,删除,修改…………)
B: $echo "B first" > 1.txt
$git-add 1.txt
$git-commit 1.txt -m "add 1.txt by B"
C: $echo "C first" > 2.txt
$git-add 1.txt
$git-commit 2.txt -m "add 2.txt by C"
3.更新远端服务器A上的版本库
方法一:
先接触两个命令:
$ git-push kongjianjun@127.0.0.1:/srv/git/pigeons.git master:master
将同步本地版本库中master分支同步到远程服务器上版本库的master分支
$ git-pull kongjianjun@127.0.0.1:/srv/git/pigeons.git master:master
将远程服务器上的版本库中的master分支同步到本地版本库的master分支
而且git-pull=git-fetch+git-merge
具体操作:$git-fetch origin //克隆上游版本库
$git-merge HEAD origin //合并分支
OK 现在对B,C操作
B:
$git-pull //push前先更新一下本地的版本库,因为可能在B更新之前,C 或者其他的 用户已经向服务器A push 了代码
$ git-push A@192.168.4.200:/project/cq8401.git master:master
//将同步本地版本库中master分支同步到远程服务器A上版本库的master分支
C: 操作同上
方法二:
还有一种方法,就是A 打上B,C传过来的补丁
在B,C上
$ git-fetch origin (1) 更新 origin 分支,防止 origin 分支不是最新的公共版本,产生错误的补丁文件;
$ git-rebase origin (2) 将你在 master 上提交的工作迁移到新的源版本库的状态的基础上
$ git-format-patch origin (3)生成补丁文件
通过email或者其他方式传给A (当然这种库不适合空仓库,即是用命令:git-init --bare --shared创建的库)
在A 上
$ git-mailinfo msg patch < xxx.patch
分析邮件,把commit log写到msg文件,补丁写到patch文件。 其他信息打印到标准输出
$ git-am xxx.patch
打上补丁
4. A 作为管理员,有必要每隔一段时间对代码量大小进行维护
为版本库打包
$ git-repack
将对象打包,并保存在 .git/objects/pack 目录当中
$ git-prune-packed
清楚那些已经被打过包的原始的对象