版本管理工具git与svn简介
版本管理工具
版本管理工具简介
- 常见版本管理工具
- cvs(Concurrent Versions System)
- vss(Visual SourceSafe)
- svn 常用的版本管理工具
- git 流行的版本管理工具(分支管理强于svn)
- bitkeeper
- hg
- cc(ClearCase)
SVN
- 常用指令
- checkout 下载代码
- update 从服务器更新本地代码代码
- add 向服务器添加文件
- commit 提交本地的更改到服务器
- showlog 查看版本日志
GIT
- 新建仓库, 初始化git目录
git init
- 向仓库中添加文件(git add)
git add * # 向仓库中添加所有文件
git add stc/ # 向仓库中添加文件夹
git add -A # 除了.gitignore之外的文件都加入
- 忽略(.gitignore)
# .gitignore文件中配置哪些文件忽略掉
# 一般这些文件忽略掉
*.config
*.creator.user
*.includes
*.files
*.bin
*.so
*.o
- 显示工作目录与暂存区状态(git status)
git status # 会看到工作区与仓库代码的异同, 不显示已经commit过的文件
- 提交(git commit)
git commit -m "add xxx"
# -m表示附加代码提交log信息, 引号中的内容根据实际情况编辑, 一般用add xxx, update xxx, delete xxx等.
- 拉取指定文件(git checkout)
git checkout xxx # checkout xxx目录/文件, 会覆盖现有目录/文件
- 查看日志(git log)
# 看历史更新信息: 会看到提交点唯一编号(hash值), 提交者, 提交时间等
git log
- 恢复到某提交点(git revert)
git revert +提交点唯一编号(hash值)
# 实际没有删除之后的代码记录, 而是将提交点的代码重新提交一次.
- 帮助
git --help
- 分支命令及操作(git branch)
# 分支用于控制项目里分支和程碑意义的版本, 避免commit的杂乱
git branch 1.0 # 创建分支1.0, 如果已存在该分支则失败
git branch -a 查看分支版本
- 切换分支(git checkout)
git checkout 1.0 # 切换到分支1.0
git checkout master # 切换回主干
git版本彻底回退
git checkout 1.0 # 先切换分支
git branch -d master # 删除主干代码提示(若为活动分支则提示)
# git branch -D master # 删除分支不提示
git branch master # 重建空白主干
回退到本分支历史提交点
git log
git reset --hard 8fcf0d63c0b2c7fc87b3974ebc04157cd310115e
# 以下命令谨慎使用
# 将本地branch1分支推送到远端branch1分支. 注意加-f命令后, 该还原点之后的所有记录也将被删除.
git push -f origin branch1:branch1
如分支为master时, 可能会出现权限问题, 错误提示如下(所push的分支权限为protected导致的):
! [remote rejected] master -> master (pre-receive hook declined)
此时, 可用管理员账户修改master分支的权限:
点击Settings->Repository->Protected Branches->unprotected 将master分支权限修改即可.
单文件回退到之前的版本
- 查看某文件的版本历史, 获取hash值(假如为:8fcf0d63c0b2c7fc87b3974ebc04157cd310115e)
git log helloWorld.cpp
- 还原文件到指定的hash值版本
git checkout 8fcf0d63c0b2c7fc87b3974ebc04157cd310115e helloWorld.cpp
- 提交(略)
修改上次提交记录(message)
git commit --amend
git多人合作开发
单分支开发
- 项目经理或管理人员在服务器创建代码库
git init test-project --bare
- 张三从服务器地址xxx克隆代码
git clone xxx
- 张三在本地test-project中写代码
git add ... git commit ... # 一系列git add和git commit操作, 提交代码到本地仓库
- 张三最终写好某个功能后, 上传代码到服务器
git push origin master:master # 将本地的master分支上传到服务器的master分支, 如果服务器没有该分支则自动创建
- 李四后提交代码
git commit ... # 一系列操作提交自己修改的代码到本地 git pull # 先同步服务器上前人的代码, 会把张三push到服务器的代码更新过来 git push origin master:master # 再上传自己的代码到服务器
多分支开发
- 张三李四分别在test-project建立自己的分支并开发, push到自己的分支上
- 管理人员进行分支合并
git merge origin/zhangsan # ^o, ^s 保存修改 git merge origin/lisi # 合并lisi代码到当前分支
- merge冲突
# 张三李四同时修改同一个地方的代码, 会出现冲突 # 此时需要沟通保留谁的代码, 并手动处理冲突
- 遇到里程碑版本则建立版本分支
git branch v2.0 git push origin v2.0:v2.0
- 张三李四则在里程碑版本上再修改
git merge origin/v2.0
- 缺点
- 分支多了以后, 管理混乱
- 注意: 管理中应明确分支的意义
多分支开发之部分同步
- 情景: lisi分支的某个功能实现需要同步到zhangsan分支
- 单个提交
git cherry-pick [commitid]
- 多个提交(不包含commitid1, 包含commitid100)
git cherry-pick [commitid1..commitid100]
- 多个提交(包含commitid1, 包含commitid100)
git cherry-pick [commitid1^..commitid100]
打标签
-
查看标签:
git tag 列出所有已有标签 git show v1.0.0 查看v1.0.0标签信息
-
添加标签:
# 格式: git tag -a 标签名 -m "附注信息" git tag -a v1.1.0 -m "完成了Win版发布"
-
将本地标签推送到远程仓库分支(加参数--tags)
# 格式: git push <远程主机名> <本地分支名>:<远程分支名> --tags git push origin develop:develop --tags
-
删除本地标签
git tag -d v1.1.0
-
将删除push到服务器
git push origin master:master --delete v1.1.0
git 从主分支历史提交点创建分支
- 拉取主分支
git clone http://xxxx.git
git log
- 从提交点
建立分支
# git checkout -b <branch name> <SHA1>
git checkout -b shenzhen1 c4fbf631011e3e6083738433a3faef853e8ffe09 # 从该sha1值新建一个shenzhen1分支
-
修改代码并提交
- 略
-
推送新分支和修改到服务器
git push origin shenzhen1:shenzhen1
# 将本地shenzhen1分支推送到服务器shenzhen1分支, 由于服务器没有shenzhen1分支, 会自动创建该分支.
- 添加分支的日志跟踪功能
git branch --set-upstream-to=origin/shenzhen1 shenzhen1
git push origin shenzhen1:shenzhen1
撤销操作
-
有时commit到错误的分支且没有push, 想取消此次commit并保持本地文件不修改, 经过以下操作, 已提交的修改又会回到本地修改(未提交列表)中.
git reset HEAD~
-
有时我们提交了错误的文件, 但未push, 我们想要恢复之前的状态, 可以采用reset操作
- 找到之前提交的git commit的id
git log
- 找到想要撤销的id
git reset --hard id
- 完成撤销,同时将代码恢复到前一commit_id 对应的版本
git reset id
完成Commit命令的撤销,但是不对代码修改进行撤销,可以直接通过git commit 重新提交对本地代码的修改
彻底删除文件或文件夹(不小心上传的隐私文件/本地大文件/项目生成文件等)及其历史记录
-
清理本地git中该文件及其记录(文件夹用rm --cached -r)
git filter-branch --force --index-filter 'git rm --cached --ignore-unmatch your-file-name' --prune-empty --tag-name-filter cat -- --all
-
强制推送到远端服务器
git push origin master --force
-
回收空间
rm -rf .git/refs/original/ git reflog expire --expire=now git gc --prune=now git gc --aggressive --prune=now
git其他命令
- 多仓库保存
git remote add myserver http://xxx.com #添加一个仓库服务器 git remote del myserver #删除一个仓库服务器myserver
- 删除服务器分支
git push origin :v2.0 #将一个空分支push到v2.0覆盖掉
- 切换git服务器(有时服务器的地址会变更, 我们需要切换远程服务器)
git remote set-url origin http://192.168.1.168:6060/git_test.git # 或者直接编辑.git/config文件中url地址, 或者使用第三方git工具直接修改
- 查看git配置信息
git config --list
- 查看git用户名
git config user.name
- 查看邮箱配置
git config user.email
- 全局配置用户名
git config --global user.name "nameVal"
- 全局配置邮箱
git config --global user.email "eamil@qq.com"
git的一些坑
- 跨平台时要配置好行尾符自动转换设置
- 如果想Unix和Win同时都能编译运行, 最好设置好行尾符转换配置
- 在全局.gitconfig里设置如下
Linux/Unix下
[core] autocrlf = false #关闭自动行尾转换或者autocrlf = input
Win下
[core] autocrlf = true #开启自动行尾转换
技巧:
- 文件或文件夹改名不要本地操作, 防止Git丢失跟踪日志, 应使用git mv进行操作
git mv -f oldfolder newfolder
- 添加文件夹使用git add -u会自动过滤掉不跟踪的文件
git add -u newfolder
技巧(屏蔽跟踪部分本地文件修改)
- 应用场景, 很多Linux下可执行文件或脚本, git到win下面, 可执行属性丢失了, 并且git会提示为可提交. 可以编写个bat脚本, 阻止git跟踪Windows上的部分文件(以auto-make.sh文件为例).
@echo off
@cd /d %~dp0
echo=
echo ==================================帮助====================================
echo git update-index --assume-unchanged file_path 仓库有但本地需忽略其更改
echo git update-index --no-assume-unchanged file_path 取消本地忽略
echo ==========================================================================
echo=
echo 开始设置项目Git本地配置
@echo on
git update-index --assume-unchanged ./auto-make.sh
@echo off
echo=
echo 设置完毕
@pause
-
设置本地永久保存git用户名和密码
- 方法1: 执行如下命令
git config --global credential.helper store
- 方法2: 修改.gitconfig文件, 加入如下配置
[credential] helper=store
-
Ubuntu安装git GUI工具
$ sudo apt-get install gitk
$ sudo apt-get install git-gui
- 在工程目录运行gitk 或者git gui 即可.