Git基础操作/Svn
- 基本操作
查看远程分支:git branch -a
查看本地分支:git branch
创建分支:git branch <name>
把分支推到远程分支 :git push origin <name>
切换分支:git checkout <name>
删除本地分支 git branch -d xxxxx
注释:新分支建好后,需要先commit一下成为独立的临时分支,不然该分支上修改的东西都会在原分支上显示,虽然后面commit之后原分支上看不到,但是,可以自由的checkout两分支之间,总是不好的。
- 新建好分支后,切换到该分支,然后进入该项目中
初始化git仓库 git init
添加文件到仓库 git add .
提交代码到仓库 git commit -m 'init commit'
git push --set-upstream origin v0.1_lihao
- 删除本地及远程分支
- 本地:
git barnch
git branch -d <BranchName>
- 远程:
git branch -a
git push origin --delete <BranchName>
- git放弃本地修改
- 未使用add:
git checkout -- filepathname
- 使用add缓存了代码:
git reset HEAD filepathname
- 使用了git commit提交了代码:
git reset --hard commitid
- git pull
- git pull命令的作用是,取回远程主机某个分支的更新,再与本地的指定分支合并。它的完整格式稍稍有点复杂
$ git pull <远程主机名> <远程分支名>:<本地分支名>
例如:比如,取回origin主机的next分支,与本地的master分支合并
$ git pull origin next:master
如果远程分支是与当前分支合并,则冒号后面的部分可以省略。
$ git pull origin next
- git log -l
撤销该修改: git reset --hard dc64491ac0f265b35424aaf1effd215ce06ed87f
查看提交历史,默认不用任何参数的话,git log 会按提交时间列出所有的更新,最近的更新排在最上面
git log -p -2 //-p显示每次提交内容差异,-2显示最近两次提交记录
git log --stat //显示简要的增改行数统计
$ git log --pretty=oneline //将每个提交放在一行显示
另外还有short,full 和fuller等参数,自己动手试试看
format,可以定制要显示的记录格式,这样的输出便于后期编程提取分析,像这样:
$ git log --pretty=format:"%h - %an, %ar : %s",下表列出了常用的格式占位符写法及其代表的意义。
选项 说明
%H 提交对象(commit)的完整哈希字串
%h 提交对象的简短哈希字串
%T 树对象(tree)的完整哈希字串
%t 树对象的简短哈希字串
%P 父对象(parent)的完整哈希字串
%p 父对象的简短哈希字串
%an 作者(author)的名字
%ae 作者的电子邮件地址
%ad 作者修订日期(可以用 -date= 选项定制格式)
%ar 作者修订日期,按多久以前的方式显示
%cn 提交者(committer)的名字
%ce 提交者的电子邮件地址
%cd 提交日期
%cr 提交日期,按多久以前的方式显示
%s 提交说明
- Fetch all tags
$ git fetch --tags //拿取所有的tag
$ git checkout tags/release-3.4.6 //切换到该tag
$ git checkout master //切换到master
Previous HEAD position was 1285c982... ZooKeeper 3.4.6 release.
Switched to branch 'master'
- Create tag
# 创建简单的标签
$ git tag v0.0.1
# 创建带有附注的 tag
$ git tag -a v0.0.2 -m "v0.0.2"
# 展示 tag信息
$ git show v0.0.2
# 给指定的 commit,打 tag
$ git tag -a v0.0.3 6d23400
- Submit tag
$ git push origin v0.0.2
# push本地所有标签
$ git push origin –tags
- Pull with specific tag
$ git clone
# 列出 tag列表,并 checkout到指定的 tag
$ git tag -l
$ git checkout tags/<tag_name>
# checkout到指定的 tag,并创建一个新的 branch
$ git checkout tags/<tag_name> -b <branch_name>
- Delete tag
- 删除本地 Tag
```
$ git tag -d v3.4.6.0
Deleted tag 'v3.4.6.0' (was 0e48a03a)
```
- 删除远程 Tag
```
$ git push origin :refs/tags/v3.4.6.0
To http://github.com/asdf2014/zookeeper.git
[deleted] v3.4.6.0
- Squash Commits into a Single Commit
# 查看哪些 commits需要进行合并
$ git log --pretty=oneline
# 合并最后 11个 commit
$ git rebase -i HEAD~11
pick xxxx yyyy #[第一个pick是不能修改的,否则会出现Cannot 'squash' without a previous commit的错误提示。如果你不小心替换掉了,那么 需要使用git rebase --abort再来一遍。]
pick xxxx yyyy
pick xxxx yyyy
# 将需要压缩的 commit之前的 `pick`替换为 `squash`
pick xxxx yyyy
squash xxxx yyyy
squash xxxx yyyy
$ git commit --amend -m 'The log length has exceeded the limit of 4 MB in Travis'
$ git push origin travis_log --force
# 如需解决冲突后,继续进行 rebase操作,可执行
$ git rebase --continue
# 如果想中断 rebase操作,则执行
$ git rebase --abort
# 更多细节
$ git rebase --help
- git stash
经常有这样的事情发生,当你正在进行项目中某一部分的工作,里面的东西处于一个比较杂乱的状态,而你想转到其他分支上进行一些工作。问题是,你不想提交进行了一半的工作,否则以后你无法回到这个工作点。解决这个问题的办法就是git stash命令。
“‘储藏”“可以获取你工作目录的中间状态——也就是你修改过的被追踪的文件和暂存的变更——并将它保存到一个未完结变更的堆栈中,随时可以重新应用。
$ git stash
你的工作目录就干净了:
$ git status
# On branch master
nothing to commit, working directory clean
这时,你可以方便地切换到其他分支工作;你的变更都保存在栈上。要查看现有的储藏,你可以使用 git stash list
$ git stash list
stash@{0}: WIP on master: 049d078 added the index file
stash@{1}: WIP on master: c264051 Revert "added file_size"
stash@{2}: WIP on master: 21d80a5 added number to log
在这个案例中,之前已经进行了两次储藏,所以你可以访问到三个不同的储藏。你可以重新应用你刚刚实施的储藏,所采用的命令就是之前在原始的 stash 命令的帮助输出里提示的:git stash apply。如果你想应用更早的储藏,你可以通过名字指定它,像这样:git stash apply stash@{2}。如果你不指明,Git 默认使用最近的储藏并尝试应用它:
$ git stash apply
你可以看到 Git 重新修改了你所储藏的那些当时尚未提交的文件。在这个案例里,你尝试应用储藏的工作目录是干净的,并且属于同一分支;但是一个干净的工作目录和应用到相同的分支上并不是应用储藏的必要条件。你可以在其中一个分支上保留一份储藏,随后切换到另外一个分支,再重新应用这些变更。在工作目录里包含已修改和未提交的文件时,你也可以应用储藏——Git 会给出归并冲突如果有任何变更无法干净地被应用。
对文件的变更被重新应用,但是被暂存的文件没有重新被暂存。想那样的话,你必须在运行 git stash apply 命令时带上一个 --index 的选项来告诉命令重新应用被暂存的变更。如果你是这么做的,你应该已经回到你原来的位置:
$ git stash apply --index
apply 选项只尝试应用储藏的工作——储藏的内容仍然在栈上。要移除它,你可以运行 git stash drop,加上你希望移除的储藏的名字:
$ git stash list
stash@{0}: WIP on master: 049d078 added the index file
stash@{1}: WIP on master: c264051 Revert "added file_size"
stash@{2}: WIP on master: 21d80a5 added number to log
$ git stash drop stash@{0}
Dropped stash@{0} (364e91f3f268f0900bc3ee613f9f733e82aaed43)
你也可以运行 git stash pop 来重新应用储藏,同时立刻将其从堆栈中移走。
- 取消储藏(Un-applying a Stash)
在某些情况下,你可能想应用储藏的修改,在进行了一些其他的修改后,又要取消之前所应用储藏的修改。Git没有提供类似于 stash unapply 的命令,但是可以通过取消该储藏的补丁达到同样的效果:
$ git stash show -p stash@{0} | git apply -R
同样的,如果你沒有指定具体的某个储藏,Git 会选择最近的储藏:
$ git stash show -p | git apply -R
- 从储藏中创建分支
如果你储藏了一些工作,暂时不去理会,然后继续在你储藏工作的分支上工作,你在重新应用工作时可能会碰到一些问题。如果尝试应用的变更是针对一个你那之后修改过的文件,你会碰到一个归并冲突并且必须去化解它。如果你想用更方便的方法来重新检验你储藏的变更,你可以运行 git stash branch,这会创建一个新的分支,检出你储藏工作时的所处的提交,重新应用你的工作,如果成功,将会丢弃储藏。
$ git stash branch testchanges
Switched to a new branch "testchanges"
# On branch testchanges
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
#
# modified: index.html
#
# Changes not staged for commit:
# (use "git add <file>..." to update what will be committed)
#
# modified: lib/simplegit.rb
#
Dropped refs/stash@{0} (f0dfc4d5dc332d1cee34a634182e168c4efc3359)
- 暂1.git比较两个分支的不同A,B
查看A有而B没有的:
git log A ^B
反之亦然。
分支重命名
git branch -m old_branch new_branch # Rename branch locally
git push origin :old_branch # Delete the old branch
git push --set-upstream origin new_branch # Push the new branch, set local branch to track the new remote
tag
打 tag 标签(在commit 之后,push之前,去添加tag)
git tag -a v1.0 -m “commit version 1.0”
加上 -f 覆盖原有的tag
git tag -f v1.0
push 到远程仓库(打完tag之后,去push即可)
push所有tag到远程仓库:git push origin –tags (注意tags前是两个短横杠)
push单个tag到远程仓库:git push origin [tagname]
删除 tag 便签
git tag -d v1.0
查看 tag 标签
git tag
切换tag
git checkout v1.0
Svn
- 检出库文件
svn checkout http://路径(目录或文件的全路径) [本地目录全路径] --username 用户名
svn checkout svn://路径(目录或文件的全路径) [本地目录全路径] --username 用户名
注:如果不带--password 参数传输密码的话,会提示输入密码,建议不要用明文的--password 选项。
其中 username 与 password前是两个短线,不是一个。
不指定本地目录全路径,则检出到当前目录下。
例子:
svn checkout svn://localhost/测试工具 /home/testtools --username wzhnsc
svn checkout http://localhost/test/testapp --username wzhnsc
- 导出(导出一个干净的不带.svn文件夹的目录树)
svn export [-r 版本号] http://路径(目录或文件的全路径) [本地目录全路径] --username 用户名
svn export [-r 版本号] svn://路径(目录或文件的全路径) [本地目录全路径] --username 用户名
svn export 本地检出的(即带有.svn文件夹的)目录全路径 要导出的本地目录全路径
注:第一种从版本库导出干净工作目录树的形式是指定URL,
如果指定了修订版本号,会导出相应的版本,
如果没有指定修订版本,则会导出最新的,导出到指定位置。
如果省略 本地目录全路径,URL的最后一部分会作为本地目录的名字。
第二种形式是指定 本地检出的目录全路径 到 要导出的本地目录全路径,所有的本地修改将会保留,
但是不在版本控制下(即没提交的新文件,因为.svn文件夹里没有与之相关的信息记录)的文件不会拷贝。
例子:
svn export svn://localhost/测试工具 /home/testtools --username wzhnsc
svn export svn://localhost/test/testapp --username wzhnsc
svn export /home/testapp /home/testtools
- 添加新文件
svn add 文件名
svn commit -m "" 文件名
注:告诉SVN服务器要添加文件了,还要用svn commint -m真实的上传上去!
例子:
svn add test.php <- 添加test.php
svn commit -m “添加我的测试用test.php“ test.php
svn add *.php <- 添加当前目录下所有的php文件
svn commit -m “添加我的测试用全部php文件“ *.php
- 提交
svn commit -m “提交备注信息文本“ [-N] [--no-unlock] 文件名
svn ci -m “提交备注信息文本“ [-N] [--no-unlock] 文件名
必须带上-m参数,参数可以为空,但是必须写上-m
例子:
svn commit -m “提交当前目录下的全部在版本控制下的文件“ * <- 注意这个*表示全部文件
svn commit -m “提交我的测试用test.php“ test.php
svn commit -m “提交我的测试用test.php“ -N --no-unlock test.php <- 保持锁就用–no-unlock开关
svn ci -m “提交当前目录下的全部在版本控制下的文件“ * <- 注意这个*表示全部文件
svn ci -m “提交我的测试用test.php“ test.php
svn ci -m “提交我的测试用test.php“ -N --no-unlock test.php <- 保持锁就用–no-unlock开关
5、更新文件
svn update
svn update -r 修正版本 文件名
svn update 文件名
例子:
svn update <- 后面没有目录,默认将当前目录以及子目录下的所有文件都更新到最新版本
svn update -r 200 test.cpp <- 将版本库中的文件 test.cpp 还原到修正版本(revision)200
svn update test.php <- 更新与版本库同步。
提交的时候提示过期冲突,需要先 update 修改文件,
然后清除svn resolved,最后再提交commit。
- 删除文件
推荐如下操作:
svn delete 文件名
svn ci -m “删除备注信息文本”
例子:
svn delete svn://localhost/testapp/test.php -m “删除测试文件test.php”
参考
1 参考一