版本库(代码仓库)
分布式版本控制系统git是用C写的。
本机器上的Git仓库配置(用户名和Email地址)
$ git config --global user.name "userName"
$ git config --global user.email "email@**.com"
版本库(代码仓库)repository
git可以跟踪文件的修改操作,任何时候都能追踪历史并还原。
二进制文件只能知道是否改动了,但是改动了什么是无法获知的。word就是二进制格式。
字符设置最好是UTF-8
windows的记事本编辑文件时会在文件的开头加上0xefbbbf(十六进制)的字符。
创建一个版本库:
[~]$ mkdir git_test
[~]$ cd git_test
[git_test]$ git init
管理组员
查看组内成员所有的情况:
$ cat /etc/group
man:x:15: #group_name:passwd:GID:user_list
#查看某一个组内的所有成员:
$ cat /etc/group |grep groupname
edemon:x:1000:
sambashare:x:128:edemon
# 第四列如果什么都没有表明该组内组名组员就是唯一的成员。
$ sudo groupadd jordan #添加组
#先将新成员加入组,再设置密码。不然会提示,用户已存在
$ sudo useradd -G jordan y1 # 添加组成员y1
$ sudo passwd y1
$ sudo groupdel jordan #删除组jordan
$ sudo vim /etc/group #编辑文件/etc/group,可以删除某一个组内的成员
文件操作
向仓库中添加文件 (add + commit):
$ git config --global user.name "username"
$ git config --global user.email "email"
$ vim test.txt
$ ls
test.txt
$ git add test.txt
$ git commit -m "add test.txt file"
[master(根提交) bd36aeb] add test.txt file
1 file changed, 2 insertions(+)
create mode 100644 test.txt
分布式系统
分布式版本控制系统没有“中央服务器”,每个人的电脑上都是一个完整的版本库,这样,工作的时候就不需要联网了。分布式版本控制系统通常也有一台充当“中央服务器”的电脑,用来方便“交换”大家的修改。
修改文件并提交
git status 查看当前git的状态
$ git status
# 位于分支 master
# 无文件要提交,干净的工作区
$ ls
test.txt
$ vim test.txt // 修改test.txt
$ git add test.txt
$ git status
# 位于分支 master
# 要提交的变更:
# (使用 "git reset HEAD <file>..." 撤出暂存区)
#
# 修改: test.txt
#
$ git commit -m "change and commit test.txt"
[master 9c04872] change and commit test.txt
1 file changed, 1 insertion(+), 1
可以用git diff查看改动的内容
注意,在commit之前查看!
$ git diff test.txt
diff --git a/test.txt b/test.txt
index 01bc9f2..62c2a74 100644
--- a/test.txt
+++ b/test.txt
@@ -1,2 +1,2 @@
-hello, this is a test file.
+hello, world. this is a test file.
查看git日志
$ git log
commit c76ada5b16f28252b7cf7950f5803f1535618d2f
Author: username <email>
Date: Wed Jul 27 13:49:37 2016 +0800
3rd change
commit 9c0487219879f5afcd41e7f3005f18e003948aab
Author: username <email>
Date: Wed Jul 27 13:10:41 2016 +0800
change and commit test.txt
commit bd36aebc6854d6ac6ae19318437b5a66534e4137
Author: username <email>
Date: Wed Jul 27 12:51:38 2016 +0800
add test.txt
改动版本到任意阶段
回到过去:
$ git reset --hard bd36aebc6854d6ac // hard参数后面添加commit的ID号即可
此时再查看日志,就不包含“未来”的记录了:
$ git log
commit bd36aebc6854d6ac6ae19318437b5a66534e4137
Author: username <email>
Date: Wed Jul 27 12:51:38 2016 +0800
add test.txt
为了穿越到未来,可以使用 git reflog
$ git reflog
bd36aeb HEAD@{0}: reset: moving to bd36aebc6854d6ac
c76ada5 HEAD@{1}: commit: 3rd change
9c04872 HEAD@{2}: commit: change and commit test.txt
bd36aeb HEAD@{3}: commit (initial): add test.txt file
第一列就是commit id
返回未来:
$ git reset --hard c76ada5
HEAD 现在位于 c76ada5 3rd change
$ cat test.txt
hello, world. this is a test file.
all server for git.
this is 3rd chenge.
暂存区与工作区
Git的版本库里存了很多东西,其中最重要的就是称为stage(或者叫index)的暂存区,还有Git为我们自动创建的第一个分支master,以及指向master的一个指针叫HEAD。
文件提交的两步:
第一步是用git add把文件添加进去,实际上就是把文件修改添加到暂存区; // 实现多次修改,一次提交
第二步是用git commit提交更改,实际上就是把暂存区的所有内容提交到当前分支。
删除文件
当我们删除工作区的文件,和版本库中的文件情况不符,使用git status可以发现提示信息:
$ git status
# 位于分支 master
# 尚未暂存以备提交的变更:
# (使用 "git add/rm <file>..." 更新要提交的内容)
# (使用 "git checkout -- <file>..." 丢弃工作区的改动)
#
# 删除: t.txt
#
修改尚未加入提交(使用 “git add” 和/或 “git commit -a”)
查看工作区的文件已经删除:
可以通过git checkout <file>
恢复过来:
$ git checkout -- t.txt
$ ls
test.txt t.txt
也可以彻底删除:
$ git rm t.txt
rm 't.txt'
$ ls
test.txt
git管理的是文件的修改,所以我们可以多次修改,多次git add,最后一次性的
git commit -m "message"
关联远程库github
GitHub创建一个Git仓库,让备份的github和本地仓库同步。
GitHub官网,右上角创建repository.
公钥的目录:
edemon@ubuntu:~/.ssh$ ls -a
. .. id_rsa id_rsa.pub known_hosts
一个常见的问题:
fatal: remote origin already exists.
解决方法:
$ git remote rm origin
push
命令行传送文件至远程库:
echo "# wei_workspace" >> README.md #建立一个说明文件
git init
git add README.md
git commit -m "first commit" #提交文件
git remote add origin https://github.com/×××/×××.git
git push -u origin master #传送文件到远程库,并且-u将本地的master分支和远程库的master分支关联起来
$ git push origin master #之后不用-u参数了,已经关联了。
clone
克隆一个仓库:
https://github.com/×××/wei_workspace.git
#创建新的目录,并克隆文件到所创建的目录
jordan@ubuntu:~$ git clone git@github.com:×××/wei_workspace.git ~/wei_workspace
注意到这两种地址格式是不同的,git@github.com:×××/wei_workspace.git是ssh的,https://github.com/×××/wei_workspace.git是https的
https: 速度慢,每次推送都必须输入口令.