本文共 7437 字,大约阅读时间需要 24 分钟。
树冲突,指的是由于目录(文件)树的改变,造成内容修改修改不能匹配在同一对象(目录/文件)上。 当一名开发人员移动、重命名、删除一个文件或文件夹,而另一名开发人员也对它们进行了移动、重命名、删除或者仅仅是修改时就会发生树冲突。
或因为两个分支同时增加了一个同名的目录,导致了树冲突。
再说Git : Git 并不保存这些前后变化的差异数据。实际上,Git 更像是把变化的文件作快照后,记录在一个微型的文件系统中。每次提交更新时,它会纵览一遍所有文件的指纹信息并对文件作一快照,然后保存一个指向这次快照的索引。为提高性能,若文件没有变化,Git 不会再次保存,而只对上次保存的快照作一链接。
除了完美解决了树冲突以外, 后面会讲到的强大的分支概念也是源于这样的思想。
时刻保持数据完整性
多数操作仅添加数据
其实本质上仅仅是个指向 commit 对象的可变指针。Git 会使用 master 作为分支的默认名字。
修改文件并做一次提交:
echo aaa >> test.txt
git commit -a -m 'made change'
git checkout master
命令回到 master 分支,效果如下图所示。| 操作| GIT | SVN |
| --- | --- | --- | |检出/复制/克隆 | git clone | svn checkout||提交| git commit |svn commit||查看提交的详细记录 |git show |svn cat||确认状态| git status |svn status||确认差异 |git diff |svn diff||确认记录| git log |svn log||添加 |git add |svn add||移动| git mv| svn mv||删除 |git rm| svn rm||取消修改 |git checkout / git reset| svn revert ||创建分支| git branch| svn copy ||切换分支| git checkout| svn switch||合并 |git merge| svn merge|创建标签| git tag| svn copy ||更新| git pull / git fetch| svn update||反映到远端 |git push |svn commit ||忽略档案目录 |.gitignore |.svnignore| 刚刚已经讲过,SVN的revert是用来取消修改,但Git的revert是用来消除提交。
以及svn commit 会直接和中央仓库交互, svn branch/tag的构造是一样的,git的branch/tag是两回事。
git 的全局设置
git config --global user.name “your_name"
git config --global user.email “your@email.com"
常用快捷键设置:
git config --global alias.st status
git config --global alias.co checkout
git config --global alias.br branch
git config --global alias.ci commit
git config --global color.ui true //打开颜色开关
git config --global alias.clog "log --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr)%Creset' --abbrev-commit --date=relative"
git init
以创建新的 git 仓库。检出仓库:
git clone git@code.aliyun.com:group/project.git
git clone http://code.aliyun.com/group/project.git
svn checkout http://code.taobao.org/repos/repo
Git:
git add <filename>
git add .
git commit -m "代码提交信息"
SVN:
svn add
svn commit -m “代码提交信息"
你的改动现在已经在本地仓库的 HEAD 中了。执行如下命令以将这些改动提交到远端仓库:
git push origin master //可以把 master 换成你想要推送的任何分支。
如果你还没有克隆现有仓库,并想将你的仓库连接到某个远程服务器,你可以使用如下命令添加:
git remote add origin git@code.aliyun.com:group/project.git
如果要添加多个远程服务器 ,那么:
git remote add github git@github.com:group/project.git
那么,在需要推送到另外的远端仓库则:
git push github master
创建一个叫做“feature_x”的分支并切换过去:
git checkout -b feature_x
切换回主分支:
git checkout master
合并分支到主分支,再把新建的分支删掉:
git merge feature_x ; git branch -d feature_x
SVN中不存在本地创建分支,合并,推送的这些概念,所以当svn创建分支时,一般是这两种做法:
svn copy trunk branches/my-feature_x-branch
svn commit -m "Creating a branch"
或者直接远程操作:
svn copy http://code.taobao.org/repos/test/trunk http://code.taobao.org/repos/test/branches/my-feature_x-branch -m "Creating a branch"
当需要切换分支时,svn有类似的概念:
svn switch http://目录全路径 本地目录全路径
要更新你的本地仓库,执行:
git pull origin <branch>
git fetch -p
,获取远端的变化,再进行merge要合并其他分支到你的当前分支(例如 master),执行:
git merge <branch>
在这两种情况下,git 都会尝试去自动合并改动。遗憾的是,这可能并非每次都成功,并可能出现冲突(conflicts)。 这时候就需要你修改这些文件来手动合并这些冲突(conflicts)。改完之后,你需要执行如下命令以将它们标记为合并成功:
git add <filename>
在合并改动之前,你可以使用如下命令预览差异:
git diff <source_branch> <target_branch>
需要更新时:
svn update
svn up
当svn进行合并时一般的做法是:
svn merge -r m:n path
svn merge branchA branchB
当出现冲突时:
svn revert file // 撤销修改
当冲突解决后:
svn resolved //resolved命令除了删除冲突文件,还修正了一些记录在工作拷贝管理区域的记录数据
为软件发布创建标签是推荐的。你可以执行如下命令创建一个叫做 1.0.0 的标签:
git tag 1.0.0 1b2e1d63ff
1b2e1d63ff 是你想要标记的提交 ID 的前 10 位字符。可以使用下列命令获取提交 ID:
git log
SVN的标签和他的分支是同样的概念, 一样是通过svn copy , 例如:
svn copy trunk tags/1.0.0
svn commit -m "Creating a tag"
假如你操作失误(当然,这最好永远不要发生),你可以使用如下命令替换掉本地改动:
git checkout -- <filename>
假如你想丢弃你在本地的所有改动与提交,可以到服务器上获取最新的版本历史,并将你本地主分支指向它:
- ` git fetch origin ` - ` git reset --hard origin/master `
这里面其实最关键的就是:
当commit 时或者直接通过lock/unlock 命令对某一个文件加锁:
svn lock -m "LockMessage" [--force] PATH
svn unlock PATH
转载地址:http://knytx.baihongyu.com/