Git 和 SVN 的比较
Git 和 SVN 是目前国内市场最常用的两个版本控制工具,两者的设计理念差异较大.
集中式版本控制系统
SVN 为集中式的版本控制系统,所有人的代码都集中保存在一个服务器上,所有客户端可以拉取代码,编辑后提交更新到服务器,它的好处是很好的实现了权限控制,也可以清晰
的看到其他人提交的记录.缺点也是很致命的:
- 集中式管理如果服务器宕机,则无法提交代码
- 如果代码服务器硬盘损坏,会导致数据丢失,需要做好数据备份
- 当文件过多时,系统庞大,下载库可能需要几个小时
- 切换分支的成本过高
- 查看代码修改记录,必须要连接SVN服务器查看
分布式版本控制系统
Git 为分布式版本控制系统,客户端并不只提取最新版本的文件快照,而是把代码仓库完整地拉取下来,当一个协作者仓库出现故障,都可以从其他协作者那里拿到最新的代码.
Git 和 SVN 在对待文件变更时,有本质性的差异,SVN 是以每个文件的差异来记录,Git 则没有这个概念,Git 没有单个文件的概念,它将整个仓库当做一个完整的文件,每次改动
都会针对整个仓库生成一个新的快照;为了高效,如果文件没有修改,Git 不再重新存储该文件,而是只保留一个链接指向之前存储的文件.
Git 的大多数命令都是本地操作的,当你管理一个大型项目的时候,可以明显感觉到Git操作的速度,比如要浏览历史记录,只需在本地查看即可,意味着你可以在任何没有网络的
地方工作,然后在有网络的地方将改动同步推送到远程仓库.
Git 保证数据完整性
Git 中所有数据在存储前都计算校验和,然后以校验和来引用;这意味着不可能在 Git 不知情时更改任何文件内容或目录内容,这个功能建构在 Git 底层,是构成 Git 不可或缺的部分.
查看Git配置
# 查看所有配置
$ git config --list
# 用户名和邮箱
user.name=heyan
user.email=heyan@xiangdd.com.cn
# 全局忽略文件
core.excludesfile=C:\Users\heyan\gitignore_global.txt
# 查看指定配置
$ git config user.name
heyan
新建仓库
$ mkdir git_example
$ cd git_example
$ git init
Initialized empty Git repository in E:/test/git_example/.git/
远程分支
拉取远程分支
$ git clone git@github.com/xxx/xxx.git [本地目录]
Git 拉取远程指定分支
$ git clone -b develop git@km-git1.kemai.cn:sunfei/develop.git
Git 强制用远程分支覆盖本地分支
$ git fetch --all //只是下载代码到本地,不进行合并操作
$ git reset --hard origin/<分支> //把HEAD指向最新下载的版本
$ git pull
添加远程仓库
当你本地已经有了库,想推送到远程仓库时,需要先创建远程仓库,然后拿到仓库地址,在本地仓库设置远程仓库地址:
# git remote <远程仓库的别名> <远程仓库地址>
$ git remote add origin git@km-git1.kemai.cn:sunfei/develop.git
# git remote -v 可以展示所有远程分支
$ git remote -v
origin git@km-git1.kemai.cn:sunfei/develop.git (fetch)
origin git@km-git1.kemai.cn:sunfei/develop.git (push)
# git remote -show 可以查看远程分支信息
$ git remote show origin
* remote origin
Fetch URL: git@km-git1.kemai.cn:sunfei/develop.git
Push URL: git@km-git1.kemai.cn:sunfei/develop.git
HEAD branch: master
Remote branches:
dev-20191224 tracked
dev-20191224-heyan tracked
prod new (next fetch will store in remotes/origin)
test tracked
Local branches configured for 'git pull':
dev-20191224 merges with remote dev-20191224
dev-20191224-heyan merges with remote dev-20191224-heyan
master merges with remote master
master_old merges with remote master_old
Local refs configured for 'git push':
dev-20191224 pushes to dev-20191224 (up to date)
dev-20191224-heyan pushes to dev-20191224-heyan (up to date)
master pushes to master (local out of date)
master_old pushes to master_old (up to date)
推送到远程仓库
格式: git push <远程仓库> <分支名>
远程仓库的移除和重命名
移除: git remote rm <远程仓库>
重命名: git remote rename <原来的仓库名称> <新的仓库名称>
git push origin master
检查当前分支的状态
$ git status
On branch master
nothing to commit, working tree clean
忽略文件
一般项目中会有一个文件是不需要纳入git版本管理的,比如编译器生成的文件,项目打包后生成的文件等等,为了解决这个问题,git引入了一个忽略文件,
该文件可以放在仓库的任一目录,文件名固定为: .gitignore,看一个java常用的忽略文件配置:
# 忽略Eclipse生成的 .project 和 .classpath 目录
.project
.classpath
#忽略 IDEA 生成的 .idea/ 目录
.idea/
# 忽略打包生成的文件目录
target/
# 忽略所有 iml/class 后缀的文件
*.iml
*.class
提交和撤销
git commit 用来将暂存区的文件添加到本地仓库,他有两个常用参数:
- -m: 提交内容
- -am: 提交内容,此操作可以省略 git add *
有时候我们提交完了才发现漏掉了几个文件没有添加,或者提交信息写错了. 此时, 可以运行带有 --amend 选项的提交命令尝试重新提交:
git commit --amend
例如,你提交后发现忘记了暂存某些需要的修改,可以像下面这样操作:
$ git commit -m 'init'
$ git add .gitignore
$ git commit --amend
最终你只会有一个提交——第二次提交将代替第一次提交的结果.
如果我们编辑了两个文件,想分别做两次提交,结果不小心执行了 git add * 让两个文件都加到了暂存区,则可以使用 git reset HEAD <file>
来取消,或者使用 `git reset --soft <最后一个commit>
撤销对文件的修改:
git checkout -- <文件>
上面的命令会把文件撤销到上次提交时的内容
分支管理
查看所有分支
$ git branch -a
* dev-20191224
dev-20191224-heyan
master
master_old
remotes/origin/HEAD -> origin/master
remotes/origin/dev-20191014
remotes/origin/dev-20191021
remotes/origin/dev-20191028
remotes/origin/dev-20191111
前面有 * 的是你当前所在分支,没有 remotes/origin/*的是本地其他分支,有remotes/origin/*的为远程分支
基于当前分支创建新分支
比如: 当前在master分支,要基于当前分支创建一个release分支,此时创建后当前分支就为release分支
$ git checkout -b release
Switched to a new branch 'release'
使用 git checkout -b <新分支名>
,这个命令相当于下面两个命令合并:
$ git branch release
$ git checkout release
切换到已有的分支
比如从release分支切换到master分支
$ git checkout master
Switched to branch 'master'
删除分支
# 删除本地分支
$ git branch -d <分支名>
# 删除远程分支
$ git push origin --delete <分支名>
合并分支
使用 `git merge <要合并的分支名>
$ git merge release
Auto-merging README.md
CONFLICT (content): Merge conflict in README.md
Automatic merge failed; fix conflicts and then commit the result.
可以看到合并时,出现了冲突,可以使用 git diff
查看冲突内容:
$ git diff README.md
diff --cc README.md
index ef600d9,b61de0c..0000000
--- a/README.md
+++ b/README.md
@@@ -1,1 -1,1 +1,5 @@@
++<<<<<<< HEAD
+merge1
++=======
+ merge test
++>>>>>>> release
使用 cherry-pick 合并指定commit到当前分支
git log 常用参数
git log
查看当前分支提交记录,默认做了分页,只展示一页的数据,如果想查询指定条数,则使用:git log -<n>
$ git log
commit 1018dd3f1e1aff00987cb067354a7b62f02599ff (HEAD -> dev-20191224, origin/dev-20191224)
Author: wangnengsheng <wangnengsheng@xiangdd.com.cn>
Date: Wed Dec 18 15:43:38 2019 +0800
修复27465 澳门手机号会员消费后未发送短信
commit 1b8266260be93b2b32565fa23114cb1e3dcbbd36
Merge: bab57871 ede65deb
Author: wangnengsheng <wangnengsheng@xiangdd.com.cn>
Date: Wed Dec 18 14:19:48 2019 +0800
Merge branch 'dev-20191224' of http://km-git1.kemai.cn/sunfei/develop into dev-20191224
commit bab57871095263705d0fe2ce5ee53d08f97671fa
Author: wangnengsheng <wangnengsheng@xiangdd.com.cn>
Date: Wed Dec 18 14:18:53 2019 +0800
修复bug26909 【出品】关联的做法和规格中有相同名字导致出品编辑报错
git log -S
查找提交记录中改动过的内容:
$ git log -SupdateObjLimitOne
commit bab57871095263705d0fe2ce5ee53d08f97671fa
Author: wangnengsheng <wangnengsheng@xiangdd.com.cn>
Date: Wed Dec 18 14:18:53 2019 +0800
修复bug26909 【出品】关联的做法和规格中有相同名字导致出品编辑报错
$ git log -p -1
-p 用来展示提交的内容差异, -1 则用来限制查询的条数为1条
$ git log -p -1
commit bab57871095263705d0fe2ce5ee53d08f97671fa
Author: wangnengsheng <wangnengsheng@xiangdd.com.cn>
Date: Wed Dec 18 14:18:53 2019 +0800
修复bug26909 【出品】关联的做法和规格中有相同名字导致出品编辑报错
diff --git a/src/main/java/com/km/controller/restaurant/ItemRestaurantController.java b/src/main/java/com/km/controller/restaurant/ItemRestaurantController.java
index 0ae97999..8b211b4c 100644
Binary files a/src/main/java/com/km/controller/restaurant/ItemRestaurantController.java and b/src/main/java/com/km/controller/restaurant/ItemRestaurantController.java differ
diff --git a/src/main/java/com/km/dao/ItempropertyDao.java b/src/main/java/com/km/dao/ItempropertyDao.java
index 5bacbfb1..8e422ac9 100644
Binary files a/src/main/java/com/km/dao/ItempropertyDao.java and b/src/main/java/com/km/dao/ItempropertyDao.java differ
diff --git a/src/main/java/com/km/dao/xml/ItempropertyDao.xml b/src/main/java/com/km/dao/xml/ItempropertyDao.xml
index 616e1421..af78b1f6 100644
--- a/src/main/java/com/km/dao/xml/ItempropertyDao.xml
+++ b/src/main/java/com/km/dao/xml/ItempropertyDao.xml
@@ -163,6 +163,63 @@
</foreach>
</update>
+ <!-- 修改该对象 只修改一条-->
+ <update id="updateObjLimitOne" parameterType="com.km.pojo.DItemproperty">
+ update itemproperty
+ <set>
+ <if test="flowId!=null and flowId!=''">
+ flowId = #{flowId},
+ </if>
+ <if test="merchantId!=null and merchantId!=''">
+ merchantId = #{merchantId},
+ </if>
+ <if test="itemId!=null and itemId!=''">
+ itemId = #{itemId},
+ </if>
+ <if test="propertyFlowId!=null and propertyFlowId!=''">
+ propertyFlowId = #{propertyFlowId},
+ </if>
+ <if test="propertyPrice!=null">
+ propertyPrice = #{propertyPrice},
+ </if>
+ <if test="tSFlag!=null and tSFlag!=''">
+ tSFlag = #{tSFlag},
+ </if>
+ <if test="deleteFlag!=null and deleteFlag!=''">
+ deleteFlag = #{deleteFlag},
+ </if>
+ <if test="propertyVipPrice!=null">
+ propertyVipPrice = #{propertyVipPrice},
+ </if>
+ <if test="propertyVipPrice2!=null">
+ propertyVipPrice2 = #{propertyVipPrice2},
+ </if>
+ <if test="propertyVipPrice3!=null">
+ propertyVipPrice3 = #{propertyVipPrice3},
+ </if>
+ <if test="specQty!=null">
+ specQty = #{specQty},
+ </if>
+ </set>
+ <where>
+ <if test="merchantId!=null and merchantId!=''">
+ and merchantId = #{merchantId}
+ </if>
+ <if test="flowId!=null and flowId!=''">
+ and flowId = #{flowId}
+ </if>
+ <if test="itemId!=null and itemId!=''">
+ and itemId = #{itemId}
+ </if>
+ <if test="propertyFlowId!=null and propertyFlowId!=''">
+ and propertyFlowId = #{propertyFlowId}
+ </if>
+ <if test="branchId!=null and branchId!=''">
+ and branchId = #{branchId}
+ </if>
+ </where>
+ limit 1
+ </update>
<!-- 修改该对象 -->
<update id="updateObj" parameterType="com.km.pojo.DItemproperty">
update itemproperty
@@ -526,6 +583,7 @@
</update>
+
<select id="getItemPropertyList" parameterType="map" resultType="com.km.pojo.DItemproperty" flushCache="true"
useCache="false">
select *
diff --git a/src/main/java/com/km/service/IItempropertyService.java b/src/main/java/com/km/service/IItempropertyService.java
index f0db2144..a079af29 100644
Binary files a/src/main/java/com/km/service/IItempropertyService.java and b/src/main/java/com/km/service/IItempropertyService.java differ
diff --git a/src/main/java/com/km/serviceImpl/ItempropertyServiceImpl.java b/src/main/java/com/km/serviceImpl/ItempropertyServiceImpl.java
index d671ac28..d6b1ee63 100644
Binary files a/src/main/java/com/km/serviceImpl/ItempropertyServiceImpl.java and b/src/main/java/com/km/serviceImpl/ItempropertyServiceImpl.java differ
git log --stat
简化查询的提交内容,只能看到修改文件新增,修改的行数
$ git log --stat
commit 1018dd3f1e1aff00987cb067354a7b62f02599ff (HEAD -> dev-20191224, origin/dev-20191224)
Author: wangnengsheng <wangnengsheng@xiangdd.com.cn>
Date: Wed Dec 18 15:43:38 2019 +0800
修复27465 澳门手机号会员消费后未发送短信
.../com/km/controller/sync/VipSyncController.java | Bin 167517 -> 167522 bytes
.../com/km/serviceImpl/VipBalanceServiceImpl.java | Bin 60779 -> 60832 bytes
2 files changed, 0 insertions(+), 0 deletions(-)
commit 1b8266260be93b2b32565fa23114cb1e3dcbbd36
Merge: bab57871 ede65deb
Author: wangnengsheng <wangnengsheng@xiangdd.com.cn>
Date: Wed Dec 18 14:19:48 2019 +0800
Merge branch 'dev-20191224' of http://km-git1.kemai.cn/sunfei/develop into dev-20191224
commit bab57871095263705d0fe2ce5ee53d08f97671fa
Author: wangnengsheng <wangnengsheng@xiangdd.com.cn>
Date: Wed Dec 18 14:18:53 2019 +0800
修复bug26909 【出品】关联的做法和规格中有相同名字导致出品编辑报错
.../restaurant/ItemRestaurantController.java | Bin 166556 -> 167779 bytes
src/main/java/com/km/dao/ItempropertyDao.java | Bin 1630 -> 1774 bytes
src/main/java/com/km/dao/xml/ItempropertyDao.xml | 58 +++++++++++++++++++++
.../java/com/km/service/IItempropertyService.java | Bin 2000 -> 2058 bytes
.../km/serviceImpl/ItempropertyServiceImpl.java | Bin 7174 -> 7327 bytes
5 files changed, 58 insertions(+)
commit ede65deb729a2b721305d4efc51f6fa972172d18
git log --pretty
这个选项可以指定使用不同于默认格式的方式展示提交历史。 这个选项有一些内建的子选项供你使用。 比如用 oneline 将每个提交放在一行显示,查看的提交数很大时非常有用。 另外还有 short,full 和 fuller 可以用,展示的信息或多或少有些不同
–pretty=oneline 展示提交的commit内容
$ git log --pretty=oneline -3
1018dd3f1e1aff00987cb067354a7b62f02599ff (HEAD -> dev-20191224, origin/dev-20191224) 修复27465 澳门手机号会员消费后未发送短信
1b8266260be93b2b32565fa23114cb1e3dcbbd36 Merge branch 'dev-20191224' of http://km-git1.kemai.cn/sunfei/develop into dev-20191224
bab57871095263705d0fe2ce5ee53d08f97671fa 修复bug26909 【出品】关联的做法和规格中有相同名字导致出品编辑报错
–pretty=short 展示提交的commit内容以及作者
$ git log --pretty=short -3
commit 1018dd3f1e1aff00987cb067354a7b62f02599ff (HEAD -> dev-20191224, origin/dev-20191224)
Author: wangnengsheng <wangnengsheng@xiangdd.com.cn>
修复27465 澳门手机号会员消费后未发送短信
commit 1b8266260be93b2b32565fa23114cb1e3dcbbd36
Merge: bab57871 ede65deb
Author: wangnengsheng <wangnengsheng@xiangdd.com.cn>
Merge branch 'dev-20191224' of http://km-git1.kemai.cn/sunfei/develop into dev-20191224
commit bab57871095263705d0fe2ce5ee53d08f97671fa
Author: wangnengsheng <wangnengsheng@xiangdd.com.cn>
修复bug26909 【出品】关联的做法和规格中有相同名字导致出品编辑报错
–pretty=full 展示提交的commit内容以及作者和提交者
$ git log --pretty=full -3
commit 1018dd3f1e1aff00987cb067354a7b62f02599ff (HEAD -> dev-20191224, origin/dev-20191224)
Author: wangnengsheng <wangnengsheng@xiangdd.com.cn>
Commit: wangnengsheng <wangnengsheng@xiangdd.com.cn>
修复27465 澳门手机号会员消费后未发送短信
commit 1b8266260be93b2b32565fa23114cb1e3dcbbd36
Merge: bab57871 ede65deb
Author: wangnengsheng <wangnengsheng@xiangdd.com.cn>
Commit: wangnengsheng <wangnengsheng@xiangdd.com.cn>
Merge branch 'dev-20191224' of http://km-git1.kemai.cn/sunfei/develop into dev-20191224
commit bab57871095263705d0fe2ce5ee53d08f97671fa
Author: wangnengsheng <wangnengsheng@xiangdd.com.cn>
Commit: wangnengsheng <wangnengsheng@xiangdd.com.cn>
修复bug26909 【出品】关联的做法和规格中有相同名字导致出品编辑报错
–pretty=fuller 展示提交的commit内容以及作者,提交者,作者编写时间和提交者时间
$ git log --pretty=fuller -3
commit 1018dd3f1e1aff00987cb067354a7b62f02599ff (HEAD -> dev-20191224, origin/dev-20191224)
Author: wangnengsheng <wangnengsheng@xiangdd.com.cn>
AuthorDate: Wed Dec 18 15:43:38 2019 +0800
Commit: wangnengsheng <wangnengsheng@xiangdd.com.cn>
CommitDate: Wed Dec 18 15:43:38 2019 +0800
修复27465 澳门手机号会员消费后未发送短信
commit 1b8266260be93b2b32565fa23114cb1e3dcbbd36
Merge: bab57871 ede65deb
Author: wangnengsheng <wangnengsheng@xiangdd.com.cn>
AuthorDate: Wed Dec 18 14:19:48 2019 +0800
Commit: wangnengsheng <wangnengsheng@xiangdd.com.cn>
CommitDate: Wed Dec 18 14:19:48 2019 +0800
Merge branch 'dev-20191224' of http://km-git1.kemai.cn/sunfei/develop into dev-20191224
commit bab57871095263705d0fe2ce5ee53d08f97671fa
Author: wangnengsheng <wangnengsheng@xiangdd.com.cn>
AuthorDate: Wed Dec 18 14:18:53 2019 +0800
Commit: wangnengsheng <wangnengsheng@xiangdd.com.cn>
CommitDate: Wed Dec 18 14:18:53 2019 +0800
修复bug26909 【出品】关联的做法和规格中有相同名字导致出品编辑报错
git log --pretty=format
可以定制要显示的记录格式
$ git log --pretty=format:"%h - %an, %ar : %s" -3
1018dd3f - wangnengsheng, 19 hours ago : 修复27465 澳门手机号会员消费后未发送短信
1b826626 - wangnengsheng, 20 hours ago : Merge branch 'dev-20191224' of http://km-git1.kemai.cn/sunfei/develop into dev-20191224
bab57871 - wangnengsheng, 20 hours ago : 修复bug26909 【出品】关联的做法和规格中有相同名字导致出品编辑报错
git log --pretty=format 常用的选项
- %H 提交对象(commit)的完整哈希字串
- %h 提交对象的简短哈希字串
- %T 树对象(tree)的完整哈希字串
- %t 树对象的简短哈希字串
- %P 父对象(parent)的完整哈希字串
- %p 父对象的简短哈希字串
- %an 作者(author)的名字
- %ae 作者的电子邮件地址
- %ad 作者修订日期(可以用 --date= 选项定制格式)
- %ar 作者修订日期,按多久以前的方式显示
- %cn 提交者(committer)的名字
- %ce 提交者的电子邮件地址
- %cd 提交日期
- %cr 提交日期,按多久以前的方式显示
- %s 提交说明
Git tag 标签使用
项目每次上线的时候,一般需要打一个标签,记录当前上线发布的是哪次提交,标签可以记录一些内容.
查看标签:
git tag
标签有两种类型
轻量标签(lightweight) 与附注标签(annotated).
一个轻量标签很像一个不会改变的分支——它只是一个特定提交的引用.
附注标签是存储在 Git 数据库中的一个完整对象.它们是可以被校验的;其中包含打标签者的名字、电子邮件地址、日期时间;还有一个标签信息;并且可以使用 GNU Privacy Guard (GPG)签名与验证. 通常建议创建附注标签,这样你可以拥有以上所有信息
附注标签(annotated)
- -a: 指定标签名
- -m: 提交内容
$ git tag -a v1.0 -m "first tag"
查看标签内容:
$ git show v1.0
tag v1.0
Tagger: heyan <heyan@xiangdd.com.cn>
Date: Thu Dec 19 10:57:43 2019 +0800
first tag
commit c3cc71167b303e53a5573cc3a495633621eca8e0 (HEAD -> master, tag: v1.0)
Author: heyan <heyan@xiangdd.com.cn>
Date: Thu Dec 19 10:57:15 2019 +0800
init
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..ea37ec4
--- /dev/null
+++ b/README.md
@@ -0,0 +1 @@
+project init
轻量标签(lightweight)
直接使用 git tag <标签名>:
$ git tag v1.1
# 查看标签内容
$ git show v1.1
commit 575c13db14b978413ca1ba9a35400f25df92df75 (HEAD -> master, tag: v1.1)
Author: heyan <heyan@xiangdd.com.cn>
Date: Thu Dec 19 11:00:10 2019 +0800
edit README.md
diff --git a/README.md b/README.md
index ea37ec4..9daeafb 100644
--- a/README.md
+++ b/README.md
@@ -1 +1 @@
-project init
+test
历史提交记录打印标签
git tag -a v1.2 -m “标签内容”
git tag -a v1.2 -m "测试历史标签" d937de75
共享标签
默认创建的标签执行 git push 是不会被推送到远程仓库的,必须要单独推送:
# 推送某个标签到远程仓库
$ git push origin v1.1
# 推送所有标签到远程仓库
$ git push origin --tags
删除标签
# 删除本地标签
$ git tag -d v1.1
# 推送到远程仓库
$ git push origin:refs/tags/v1.1
检出标签
可以使用 git checkout
命令,切换后如果做了新的提交,可能会产生一些副作用,尽量不要在分支上提交代码
# git checkout -b <新分支名称> <标签名>
$ git checkout -b test v1.1