Git 环境设置(安装)
Git客户端安装
如果使用的是GNU/ Linux 发行版Debian基本apt-get命令就可以搞定一切。
[ubuntu ~]$ sudo apt-get install git-core
[ubuntu ~]$ git --version
git version 1.8.1.2
如果使用的是基于RPM的GNU/ Linux发行版使用yum命令,如下:
[CentOS ~]# yum -y install git-core
[CentOS ~]# git --version
git version 1.7.1
自定义Git环境
设置用户名
$ git config --global user.name "wuseyukui"
设置电子邮件ID
$ git config --global user.email "wuseyukui@163.com"
设置默认编辑器
$ git config --global core.editor vim
设置默认的合并工具
$ git config --global merge.tool vimdiff
获取与创建项目
git init :在目录中创建新的 Git 仓库。 可以在任何时候、任何目录中这么做,完全是本地化的。
git clone :拷贝一个 Git 仓库到本地
git remote详解
为了便于管理,Git要求每个远程主机都必须指定一个主机名。git remote命令就用于管理主机名。
不带选项的时候,git remote命令列出所有远程主机。
$ git remote
origin
使用-v选项,可以参看远程主机的网址。
$ git remote -v
origin git@github.com:jquery/jquery.git (fetch)
origin git@github.com:jquery/jquery.git (push)
上面命令表示,当前只有一台远程主机,叫做origin,以及它的网址。
克隆版本库的时候,所使用的远程主机自动被Git命名为origin。如果想用其他的主机名,需要用git clone命令的-o选项指定。
$ git clone -o jQuery https://github.com/jquery/jquery.git
$ git remote
jQuery
上面命令表示,克隆的时候,指定远程主机叫做jQuery。
git remote show命令加上主机名,可以查看该主机的详细信息。
$ git remote show <主机名>
git remote add命令用于添加远程主机。
$ git remote add <主机名> <网址>
git remote rm命令用于删除远程主机。
$ git remote rm <主机名>
git remote rename命令用于远程主机的改名。
$ git remote rename <原主机名> <新主机名>
git branch
git branch命令的-r选项,可以用来查看远程分支,-a选项查看所有分支。
$ git branch -r
origin/master // 远程分支
$ git branch -a
* master // 本地分支,当前分支
remotes/origin/master // 远程分支
git branch newBrach // 创建新分支
上面命令表示,本地主机的当前分支是master,远程分支是origin/master。
git fetch详解
一旦远程主机的版本库有了更新(Git术语叫做commit),需要将这些更新取回本地,这时就要用到git fetch命令。git fetch只是将更新取回到本地,并没有与本地分支合并,合并代码需要使用git merge/git rebase命令完成。
$ git fetch <远程主机名>
上面命令将某个远程主机的更新,全部取回本地。
默认情况下,git fetch取回所有分支(branch)的更新。如果只想取回特定分支的更新,可以指定分支名。
$ git fetch <远程主机名> <分支名>
所取回的更新,在本地主机上要用”远程主机名/分支名”的形式读取。比如origin主机的master,就要用origin/master读取。
两个应用场景:
1、取回远程主机的更新以后,可以在它的基础上创建一个新的分支。
git branch newBrach // 创建新分支
git checkout newBrach // 切换到新分支
上面两个命令也可以合成为一个命令:
$ git checkout -b newBrach origin/master
上面命令表示,在origin/master的基础上,创建一个新分支。
2、使用git merge命令或者git rebase命令,在本地分支上合并远程分支。
$ git merge origin/master
# 或者
$ git rebase origin/master
上面命令表示在当前分支上,合并origin/master。
git checkout
git checkout除了上面可以切换分支,还可以从远程仓库检出文件。
git checkout 分支名 -- a.jsp文件的完整相对路径
也可省略为:
git checkout a.jsp
git checkout . // 当前目录
git pull详情
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 push详解
git push命令用于将本地分支的更新,推送到远程主机。它的格式与git pull命令相仿。
$ 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选项,结果导致在远程主机产生一个”非直进式”的合并(non-fast-forward merge)。除非你很确定要这样做,否则应该尽量避免使用–force选项。
最后,git push不会推送标签(tag),除非使用–tags选项。
$ git push origin --tags
git reset 恢复之前版本
git reset --hard 目标版本号
git rm详解
第一步:
git rm -rf -n“target/*”
git rm -rf -n --cached“target/*” :-n:加上这个参数,执行命令时,是不会删除任何文件,而是展示此命令要删除的文件列表预览。
git rm -rf“test.txt”
git rm -rf --cached“test.txt”:最终执行命令.
第二步:
git commit -m "注释"
第三步:
git push origin 提交到远程仓库
本地文件被删除了,但仓库中未删除,如何还原文件?
git checkout .
git diff命令详解
HEAD commit版本
Index staged版本
git diff
比较的是工作目录(Working tree)和暂存区域快照(index)之间的差异,也就是修改之后还没有add暂存起来的变化内容。
git diff --cached
git diff --staged
查看已经暂存起来的文件(staged)和上次提交时的快照之间(HEAD)的差异,也就是下一次commit时会提交到HEAD的内容。
git diff HEAD
显示工作目录(Working tree)和HEAD的差别。
git diff HEAD^ HEAD
比较上次提交commit和上上次提交
**git diff SHA1(版本号1) SHA2(版本号2) **
比较两个历史版本之间的差异
git diff branch1 branch2
直接将两个分支上最新的提交做diff
比较本地分支版本和远程版本的不同
假定远端库名为 origin, 你要比较的本地分支为 test, 远端分支为 master
# 获取远端库最新信息
$ git fetch origin
# 做diff
$ git diff test origin/master
查看仓库操作日志
查看日志详情
$ git log
上面的命令会产生以下结果:
commit fb06f1226a8e957d30adcb47f58a6fa0203328d2
Author: wuseyukui <672180720@qq.com>
Date: Thu Nov 3 17:46:45 2016 +0800
update2
使用git show命令查看提交的细节。
$ git show fb06f1226a8e957d30adcb47f58a6fa0203328d2
上面的命令会产生以下结果:
Author: wuseyukui <672180720@qq.com>
Date: Thu Nov 3 17:46:45 2016 +0800
update2
diff --git a/taotao-manager/taotao-manager-web/src/main/java/com/taotao/manager/controller/PicUploadController.java b/taotao-manager/taotao-manager-web/src/main/java/com/taotao/manager/controller/PicUploadController.java
index 638ed44..8c0cef1 100644
--- a/taotao-manager/taotao-manager-web/src/main/java/com/taotao/manager/controller/PicUploadController.java
+++ b/taotao-manager/taotao-manager-web/src/main/java/com/taotao/manager/controller/PicUploadController.java
@@ -127,7 +127,8 @@ public class PicUploadController {
}
// 生成新的文件名
String fileName = new DateTime(nowDate).toString("yyyyMMddhhmmssSSSS")
- + RandomUtils.nextInt(100, 9999) + "." + StringUtils.substringAfterLast(sourceFileName, ".");
+ + RandomUtils.nextInt(100, 9999)
+ + "." + StringUtils.substringAfterLast(sourceFileName, ".");
return fileFolder + File.separator + fileName;
}
查看远程仓库的日志
本地仓库没有更新(git remote update),不可能看到远端仓库的log(git log origin/master)
如果只是不希望影响到本地仓库的代码(远端与本地做merge),可以按如下命令来做:
# 本地仓库更新,拿到远端的所有元数据
git remote update
# $BRANCH就是远端分支branch
git log origin/$BRANCH
.gitignore
如果不希望某个文件或目录被提交到仓库,则在项目根目录下,和.git 同级目录下,新建一个**.gitignore**文件,内容参考如下:
###Java###
# Java class files
*.class
# generated files
bin/
gen/
###Maven###
target/
###Eclipse###
.metadata/
.recommenders/
RemoteSystemsTempFiles/
Servers/
# Eclipse project files
.classpath
.project
*.pydevproject
.project
.metadata
bin/**
tmp/**
tmp/**/*
*.tmp
*.bak
*.swp
*~.nib
local.properties
.classpath
.settings/
.loadpath
# External tool builders
.externalToolBuilders/
# Locally stored "Eclipse launch configurations"
*.launch
Git分支
在 Git 中提交时,会保存一个提交(commit)对象。
Git 中的分支,其实本质上仅仅是个指向 commit 对象的可变指针。Git 会使用 master 作为分支的默认名字。
创建一个新的分支指针。比如新建一个 testing 分支,可以使用 git branch 命令:
$ git branch testing
Git 是如何知道你当前在哪个分支上工作的呢?其实答案也很简单,它保存着一个名为 HEAD 的特别指针。它是一个指向你正在工作中的本地分支的指针(译注:将 HEAD 想象为当前分支的别名。)。运行git branch 命令,仅仅是建立了一个新的分支,但不会自动切换到这个分支中去,所以如上图,我们依然还在 master 分支里工作。
要切换到其他分支,可以执行 git checkout 命令。我们现在转换到新建的 testing 分支:
$ git checkout testing
这样 HEAD 就指向了 testing 分支,如下图: