安装Git与依赖包:
Git 的工作需要调用 curl,zlib,openssl,expat,libiconv 等库的代码,所以需要先安装这些依赖工具。
[root@localhost ~]# yum -y install curl-devel openssl-devel expat-devel gettext-devel zlib-devel [root@localhost ~]# yum -y install git-core [root@localhost ~]# git --version git version 1.8.3.1
Git配置:
Git 提供了一个叫做 git config 的工具,专门用来配置或读取相应的工作环境变量。
这些环境变量,决定了 Git 在各个环节的具体工作方式和行为。这些变量可以存放在以下三个不同的地方:
- /etc/gitconfig 文件:系统中对所有用户都普遍适用的配置。若使用 git config 时用 --system 选项,读写的就是这个文件。
- ~/.gitconfig 文件:用户目录下的配置文件只适用于该用户。若使用 git config 时用 --global 选项,读写的就是这个文件。
- 当前项目的 Git 目录中的配置文件(也就是工作目录中的 .git/config 文件):这里的配置仅仅针对当前项目有效。每一个级别的配置都会覆盖上层的相同配置,所以 .git/config 里的配置会覆盖 /etc/gitconfig 中的同名变量。
用户信息
配置个人的用户名称和电子邮件地址:
[root@localhost ~]# git config --global user.name "xxxxxxxxxxx" [root@localhost ~]# git config --global user.email xxxxxxxx@qq.com
如果用了 --global 选项,那么更改的配置文件就是位于你用户主目录下的那个,以后你所有的项目都会默认使用这里配置的用户信息。
如果要在某个特定的项目中使用其他名字或者电邮,只要去掉 --global 选项重新配置即可,新的设定保存在当前项目的 .git/config 文件里。
查看配置信息
要检查已有的配置信息,可以使用 git config --list
命令:
[root@localhost ~]# git config --list user.name=xxxxxxxxx user.email=xxxxxxxx@qq.com [root@localhost ~]# cat /root/.gitconfig //可以在/root/.gitconfig下看到配置信息 [user] name = xxxxxx email = xxxxxxx@qq.com [root@localhost ~]# git config user.name //也可直接查看某个环境变量的设定,只要把特定的名字跟在后面即可 xxxxxxxxx
Git工作流程
一般工作流程如下:
- 克隆 Git 资源作为工作目录。
- 在克隆的资源上添加或修改文件。
- 如果其他人修改了,你可以更新资源。
- 在提交前查看修改。
- 提交修改。
- 在修改完成后,如果发现错误,可以撤回提交并再次修改并提交。
Git基本概念
-Git仓库:
保存所有数据的地方。
-工作区:
从仓库中提取出来的文件,放在磁盘上供你使用或修改。
-暂存区:
就是一个文件,索引文件,保存了下次将提交的文件列表信息。
Git创建仓库
git init
Git 使用 git init
命令来初始化一个 Git 仓库,Git 的很多命令都需要在 Git 的仓库中运行,所以 git init 是使用 Git 的第一个命令。
在执行完成 git init 命令后,Git 仓库会生成一个 .git 目录,该目录包含了资源的所有元数据,其他的项目目录保持不变(不像 SVN 会在每个子目录生成 .svn 目录,Git 只在仓库的根目录生成 .git 目录)。
git init :
使用当前目录作为Git仓库并初始化。
git init 指定目录:
使用指定目录作为Git仓库。
[root@localhost ~]# mkdir gitrepo [root@localhost ~]# git init gitrepo 初始化空的 Git 版本库于 /root/gitrepo/.git/ [root@localhost ~]# cd gitrepo [root@localhost gitrepo]# ls -a . .. .git
git clone
使用 git clone 从现有 Git 仓库中拷贝项目。
参数说明:
repo:
Git 仓库。directory:
本地目录。
格式:
git clone <repo>:
克隆仓库到当前目录。
git clone <repo> <directory>:
克隆到指定的目录。
[root@localhost gitrepo]# git clone https://github.com/xxx/Test.git //克隆git代码仓库test 正克隆到 'Test'... remote: Enumerating objects: 20, done. remote: Counting objects: 100% (20/20), done. remote: Compressing objects: 100% (13/13), done. remote: Total 20 (delta 3), reused 15 (delta 1), pack-reused 0 Unpacking objects: 100% (20/20), done. [root@localhost gitrepo]# ls Test //如果要自己定义新的目录名称,可以在上面的命令末尾指定新的名字: [root@localhost gitrepo]# git clone https://github.com/xxx/Test.git newrepo
基本快照
Git 的工作就是创建和保存你的项目快照及与之后的快照进行对比。
git add
git add
命令可将该文件添加到缓存。
git add .
添加当前项目的所有文件至缓存。
[root@localhost Test]# echo hello wolrd > hello.txt [root@localhost Test]# git status -s //用于查看项目的当前状态 ?? hello.txt [root@localhost Test]# git add hello.txt //将hello.txt添加到缓存 [root@localhost Test]# git status -s A hello.txt [root@localhost Test]# echo "#git test" >> hello.txt //修改文件 [root@localhost Test]# git status -s //再执行查看项目状态 AM hello.txt
"AM" 状态的意思是,这个文件在我们将它添加到缓存之后又有改动。改动后我们再执行 git add 命令将其添加到缓存中:
[root@localhost Test]# git add . [root@localhost Test]# git status -s A hello.txt
git status
git status
查看文件在上次提交之后是否有修改。
-s
以简短的结果输出,不加该参数会详细输出内容:
[root@localhost Test]# git status # 位于分支 master # 要提交的变更: # (使用 "git reset HEAD <file>..." 撤出暂存区) # # 新文件: hello.txt
git rm
如果只是简单地从工作目录中手工删除文件,运行 git status
时就会在 Changes not staged for commit 的提示。要从 Git 中移除某个文件,就必须要从已跟踪文件清单中移除,然后提交。 可以用以下命令完成此项工作:
git rm <file>
[root@localhost Test]# git rm gittest/ rm 'gittest' [root@localhost Test]# ls hello.txt README.md
如果删除之前修改过并且已经放到暂存区域的话,则必须要用强制删除选项 -f
git rm -f <file>
[root@localhost Test]# cat > hello.txt <<EOF //修改hello.txt文件 > hello world > EOF [root@localhost Test]# git status //查看项目状态 # 位于分支 master # 尚未暂存以备提交的变更: # (使用 "git add <file>..." 更新要提交的内容) # (使用 "git checkout -- <file>..." 丢弃工作区的改动) # # 修改: hello.txt # [root@localhost Test]# git rm hello.txt //不加-f无法删除已修改并已经放到暂存区的文件 error: 'hello.txt' 有本地修改 (使用 --cached 保存文件,或用 -f 强制删除)
如果把文件从暂存区域移除,但仍然希望保留在当前工作目录中,换句话说,仅是从跟踪清单中删除,使用 --cached
选项即可。
git rm --cached <file>
[root@localhost Test]# git rm --cached hello.txt rm 'hello.txt' [root@localhost Test]# ls hello.txt README.md [root@localhost Test]# git status # 位于分支 master # 未跟踪的文件: # (使用 "git add <file>..." 以包含要提交的内容) # # hello.txt
可以递归删除,即如果后面跟的是一个目录做为参数,则会递归删除整个目录中的所有子目录和文件:
git rm –r *
进入某个目录中,执行此语句,会删除该目录下的所有文件和子目录。
git mv
git mv
命令用于移动或重命名一个文件、目录、软连接。
[root@localhost Test]# git add hello.txt //将刚才使用git rm --cached的文件add添加回来 [root@localhost Test]# git mv hello.txt test.txt //重命名 [root@localhost Test]# ls README.md test.txt
git commit
使用 git add
命令将想要快照的内容写入缓存区,而执行 git commit
将缓存区内容添加到仓库中。Git 为你的每一个提交都记录你的名字与电子邮箱地址,所以第一步需要配置用户名和邮箱地址。
[root@localhost Test]# cat > hello.txt <<EOF > this is a testfile > hello world! > EOF [root@localhost Test]# git add . [root@localhost Test]# git status -s A hello.txt [root@localhost Test]# git commit -m "第一次版本提交" [master d7edad6] 第一次版本提交 1 file changed, 2 insertions(+) create mode 100644 hello.txt
现在我们已经记录了文件快照,再执行git status
查看一下项目状态:
[root@localhost Test]# git status # 位于分支 master # 您的分支领先 'origin/master' 共 1 个提交。 # (使用 "git push" 来发布您的本地提交) # 无文件要提交,干净的工作区
以上输出说明我们在最近一次提交之后,没有做任何改动,是一个"working directory clean:干净的工作目录"。
如果觉得 git add
提交缓存的流程太过繁琐,Git 也允许用 -a 选项跳过这一步。命令格式如下:
git commit -a
[root@localhost Test]# cat >> hello.txt <<EOF > The second modification of the file > EOF > [root@localhost Test]# git commit -am "修改hello文件" [master 6f94a01] 修改hello文件 1 file changed, 1 insertion(+)
因为加了-a
参数,所以在修改完文件之后不用先git add
提交缓存,直接可以git commit
提交至仓库。
git fetch
一旦远程主机的版本库有了更新(Git术语叫做commit),需要将这些更新取回本地,这时就要用到git fetch命令。
git fetch <远程主机名>
上面命令将某个远程主机的更新,全部取回本地。
git fetch命令通常用来查看其他人的进程,因为它取回的代码对你本地的开发代码没有影响。
默认情况下,git fetch取回所有分支(branch)的更新。如果只想取回特定分支的更新,可以指定分支名。
git fetch <远程主机名> <分支名>
比如,取回origin主机的master分支。
git fetch origin master
所取回的更新,在本地主机上要用"远程主机名/分支名"的形式读取。比如origin主机的master,就要用origin/master读取。
git branch命令的-r选项,可以用来查看远程分支,-a选项查看所有分支。
$ git branch -r origin/master $ git branch -a * master remotes/origin/master
上面命令表示,本地主机的当前分支是master,远程分支是origin/master。
取回远程主机的更新以后,可以在它的基础上,使用git checkout命令创建一个新的分支。
git checkout -b newBrach origin/master
上面命令表示,在origin/master的基础上,创建一个新分支。
此外,也可以使用git merge命令或者git rebase命令,在本地分支上合并远程分支。
git merge origin/master # 或者 $ git rebase origin/master
上面命令表示在当前分支上,合并origin/master。
git push
将本地库中的更新推送给远程库。
git push <远程主机名> <本地分支名>:<远程分支名>
注意:
分支推送顺序的写法是<来源地>:<目的地>,所以git pull是<远程分支>:<本地分支>,而git push是<本地分支>:<远程分支>。
如果省略远程分支名,则表示将本地分支推送与之存在"追踪关系"的远程分支(通常两者同名),如果该远程分支不存在,则会被新建。
git push origin master
上面命令表示,将本地的master分支推送到origin主机的master分支。如果后者不存在,则会被新建。
如果省略本地分支名,则表示删除指定的远程分支,因为这等同于推送一个空的本地分支到远程分支。
git push origin :master # 等同于 git push origin --delete master
上面命令表示删除origin主机的master分支。
如果当前分支与远程分支之间存在追踪关系,则本地分支和远程分支都可以省略。
git push origin
上面命令表示,将当前分支推送到origin主机的对应分支。
如果当前分支只有一个追踪分支,那么主机名都可以省略。
git push
如果当前分支与多个主机存在追踪关系,则可以使用-u选项指定一个默认主机,这样后面就可以不加任何参数使用git push。
git push -u origin master
上面命令将本地的master分支推送到origin主机,同时指定origin为默认主机,后面就可以不加任何参数使用git push了。
不带任何参数的git push,默认只推送当前分支,这叫做simple方式。此外,还有一种matching方式,会推送所有有对应的远程分支的本地分支。Git 2.0版本之前,默认采用matching方法,现在改为默认采用simple方式。如果要修改这个设置,可以采用git config命令。
git config --global push.default matching # 或者 git config --global push.default simple
还有一种情况,就是不管是否存在对应的远程分支,将本地的所有分支都推送到远程主机,这时需要使用--all选项。
git push --all origin
上面命令表示,将所有本地分支都推送到origin主机。
如果远程主机的版本比本地版本更新,推送时Git会报错,要求先在本地做git pull合并差异,然后再推送到远程主机。这时,如果你一定要推送,可以使用--force选项。
git push --force origin
上面命令使用--force选项,结果导致远程主机上更新的版本被覆盖。除非你很确定要这样做,否则应该尽量避免使用--force选项。
最后,git push不会推送标签(tag),除非使用--tags选项。
git push origin --tags
git pull
取回远程主机某个分支的更新,再与本地的指定分支合并。
git pull <远程主机名> <远程分支名>:<本地分支名>
比如,取回origin主机的next分支,与本地的master分支合并,需要写成下面这样。
git pull origin next:master
如果远程分支是与当前分支合并,则冒号后面的部分可以省略。
git pull origin next
上面命令表示,取回origin/next分支,再与当前分支合并。实质上,这等同于先做git fetch,再做git merge。
git fetch origin git merge origin/next
在某些场合,Git会自动在本地分支与远程分支之间,建立一种追踪关系(tracking)。比如,在git clone的时候,所有本地分支默认与远程主机的同名分支,建立追踪关系,也就是说,本地的master分支自动"追踪"origin/master分支。
Git也允许手动建立追踪关系。
git branch --set-upstream master origin/next
上面命令指定master分支追踪origin/next分支。
如果当前分支与远程分支存在追踪关系,git pull就可以省略远程分支名。
git pull origin
上面命令表示,本地的当前分支自动与对应的origin主机"追踪分支"(remote-tracking branch)进行合并。
如果当前分支只有一个追踪分支,连远程主机名都可以省略。
git pull
上面命令表示,当前分支自动与唯一一个追踪分支进行合并。
如果合并需要采用rebase模式,可以使用--rebase选项。
git pull --rebase <远程主机名> <远程分支名>:<本地分支名>
如果远程主机删除了某个分支,默认情况下,git pull 不会在拉取远程分支的时候,删除对应的本地分支。这是为了防止,由于其他人操作了远程主机,导致git pull不知不觉删除了本地分支。
但是,你可以改变这个行为,加上参数 -p 就会在本地删除远程已经删除的分支。
git pull -p # 等同于下面的命令 git fetch --prune origin git fetch -p