|------->git add file | |------>git commit|
Work Directory Stage(Index) History
|<-------git checkout file| |<------git reset |
1.git add files 把当前文件放入暂存区域。把我们要提交的文件的信息添加到索引库中。
2.git checkout -- files 把文件从暂存区域复制到工作目录,用来丢弃本地修改。
(1)当给定某个文件名(或者打开-p选项,或者文件名和-p选项同时打开)时,git会从指定的提交中拷贝文件到暂存区域和工作目录。比如,git checkout HEAD~ foo.c会将提交节点HEAD~(即当前提交节点的父节点)中的foo.c复制到工作目录并且加到暂存区域中。(如果命令中没有指定提交节点,则会从暂存区域中拷贝内容。)注意当前分支不会发生变化。
(2)当给出一个(本地)分支时,那么HEAD标识会移动到那个分支,然后暂存区域和工作目录中的内容会和HEAD对应的提交节点一致。新提交节点中的所有文件都会被复制(到暂存区域和工作目录中);只存在于老的提交节点中的文件会被删除;不属于上述两者的文件会被忽略,不受影响。
(3)如果既没有指定文件名,也没有指定分支名,而是一个标签、远程分支、SHA-1值或者是像master~3类似的东西,就得到一个匿名分支,称作detached HEAD(被分离的HEAD标识)。这样可以很方便地在历史版本之间互相切换。比如说你想要编译1.6.6.1版本的git,你可以运行git checkout v1.6.6.1(这是一个标签,而非分支名),编译,安装,然后切换回另一个分支,比如说git checkout master。然而,当提交操作涉及到“分离的HEAD”时,其行为会略有不同。
当HEAD处于分离状态(不依附于任一分支)时,提交操作可以正常进行,但是不会更新任何已命名的分支。(你可以认为这是在更新一个匿名分支。)
一旦此后你切换到别的分支,比如说master,那么这个提交节点(可能)再也不会被引用到,然后就会被丢弃掉了。
但是,如果你想保存这个状态,可以用命令git checkout -b name来创建一个新的分支
***当进行版本切换操作时,如果想修改版本并上传,需要给匿名分支一个名字,能够被访问不被丢弃。
命令:
git checkout master //取出master版本的head。
git checkout tag_name //在当前分支上 取出 tag_name 的版本
git checkout master file_name //放弃当前对文件file_name的修改
git checkout commit_id file_name //取文件file_name的 在commit_id是的版本。commit_id为 git commit 时的sha值
$ git checkout filename 这条命令把修改的文件从HEAD中签出并且把它恢复成未修改时的样子,可以用来去掉误修改;
3.git commit 给暂存区域生成快照并提交。
提交时,git用暂存区域的文件创建一个新的提交,并把此时的节点设为父节点。然后把当前分支指向新的提交节点。即便当前分支是某次提交的祖父节点,git会同样操作。
git commit --amend更改提交信息,git会使用与当前提交相同的父节点进行一次新提交,旧的提交会被取消。
git commit -a 选项可只将所有被修改或者已删除的且已经被git管理的文档提交倒仓库中。
git commit -m "提交的描述信息"
4.git reset -- files 用来撤销最后一次git add files,你也可以用git reset 撤销所有暂存区域文件。
reset命令把当前分支指向另一个位置,并且有选择的变动工作目录和索引。也用来在从历史仓库中复制文件到索引,而不动工作目录。
如果不给选项,那么当前分支指向到那个提交。如果用--hard选项,那么工作目录也更新,如果用--soft选项,那么都不变。
如果给了文件名(或者 -p选项), 那么工作效果和带文件名的checkout差不多,除了索引被更新。
如果你觉得你合并后的状态是一团乱麻,想把当前的修改都放弃,你可以用下面的命令回到合并之前的状态:$ git reset --hard HEAD
你已经把合并后的代码提交,但还是想把它们撒销:$ git reset --hard ORIG_HEAD
但是刚才这条命令在某些情况会很危险,如果你把一个已经被另一个分支合并的分支给删了,那么 以后在合并相关的分支时会出错
命令:git reset HEAD ... 撤销add的文件(回退某个版本,保留原码,回退commit和index信息)
不带参数:回退某个版本,保留原码,回退commit和index信息
--soft :回退某个版本,只回退commit信息,不会回复到index信息,如果还要提交直接commit即可
--hard :彻底回退某个版本,本地原码也会跟改到上一个版本
5.Merge
merge 命令把不同分支合并起来。合并前,索引必须和当前提交相同。如果另一个分支是当前提交的祖父节点,那么合并命令将什么也不做。另一种情况是如果当前提交是另一个分支的祖父节点,就导致fast-forward合并。指向只是简单的移动,并生成一个新的提交。
git merge branchname 这个命令把分支"branchname"合并到了当前分支里面
6.Rebase
衍合是合并命令的另一种选择。合并把两个父分支合并进行一次提交,提交历史不是线性的。衍合在当前分支上重演另一个分支的历史,提交历史是线性的。 本质上,这是线性化的自动的 cherry-pick
cherry-pick命令"复制"一个提交节点并在当前复制做一次完全一样的新提交。
交互式rebase提供了一个简单易用的途径让你在和别人分享提交之前对你的提交进行分割、合并或者重排序。在把从其他开发者处拉取的提交应用到本地时,你也可以使用交互式rebase对它们进行清理。
*git使用amend选项提供了最后一次commit的反悔。但是对于历史提交呢,就必须使用rebase了。
git rebase -i HEAD~3
表示要修改当前版本的倒数第三次状态。
这个命令出来之后,会出来三行东东:
pick:*******
pick:*******
pick:*******
如果你要修改哪个,就把那行的pick改成edit,然后退出。
这时通过git log你可以发现,git的最后一次提交已经变成你选的那个了,这时再使用:
git commit --amend
来对commit进行修改。
修改完了之后,要回来对不对?
使用git rebase --continue
7.查看历史 git log
(1) git log显示补丁(patchs) git log -p
(2)日志统计 --stat :它会显示在每个提交(commit)中哪些文件被修改了, 这些文件分别添加或删除了多少行内容
(3)格式化日志 --pretty :‘--pretty'参数可以使用若干表现格式,如‘oneline 命令:'git log --pretty=oneline
(4)可视化 --graph :用ASCII字符来画出一个很漂亮的提交历史(commit history)线
(5)日志排序 ‘--reverse'参数来逆向显示所有日志
'--date-order'参数,这样显示提交日志的顺序主要按提交日期来排序;等
8.比较提交 diff
$ git diff master..test 只显示两个分支间的差异
$ git diff master...test 找出‘master’,‘test’的共有 父分支和'test'分支之间的差异
在下次提交时要提交的内容(staged,添加到索引中),显示你当前的索引和上次提交间的差异$ git diff --cached
显示你工作目录与上次提交时之间的所有差别,这条命令所显示的 内容都会在执行"git commit -a"命令时被提交 $ git diff HEAD
9.git pull命令执行两个操作: 它从远程分支(remote branch)抓取修改 的内容,然后把它合并进当前的分支。
git fetch来执行"git pull"前半部分的工作, 但是这条命令并不会把抓下来的修改合并到当前分支里。
强制git-push在上传修改时先更新,只要在分支名前面加一个加号
git add"去把它们加到索引中
在顶层工作目录中添加一个叫".gitignore"的文件,来告诉Git系统要忽略 掉哪些文件
10.git clean 删除一些没有git add的文件(-f删除文件,-df删除文件和目录)
11. Stash
git stash 用来备份当前工作区的内容。 从最近的一次提交中读取相关内容,让工作区保证和上次提交的内容一致。
可以多次使用git stash来保存当前的修改。
git list可以看到一共保存了多少次。
linux-2.6$ git stash list
stash@{0}: WIP on 3.0: 02f8c6a Linux 3.0
stash@{1}: WIP on pci-fix: 79eefa4 Optimize the resource overlap check
stash@{2}: WIP on pci-fix: 02f8c6a Linux 3.0
stash@{3}: WIP on 3.0: 02f8c6a Linux 3.0
git stash save "name"
git stash
这两个都是保存当前的改动, 如果有name则可以添加一个方便辨识的标签。
git stash apply 用来恢复最近一次的修改。
git stash apply stash@{1}来恢复指定的修改。
git stash pop stash@{1} 的作用和git stash apply类似。
git stash pop 会从stash栈中移除某个记录,而git stash apply不会。
git stash clear 清空栈。
12. Tag
1. 显示tag
git tag 显示所有的tag
匹配显示
$ git tag -l v3.0*
v3.0
v3.0-rc1
v3.0-rc2
v3.0-rc3
v3.0-rc4
v3.0-rc5
v3.0-rc6
v3.0-rc7
2. 显示某个tag的详细信息
git show v3.0
3. 创建tag
git tag -a v1.4 -m "my version 1.4"
git tag -s v1.5 -m "my version 1.5"
这个将会加上pgp的签名
对于一个-s的tag, 你可以
git tag -v v1.5
来验证这个tag, 当然你需要有对方的PGP公钥。
git tag v1.4-lw
这个是轻量级的tag。
git tag -a v1.2 SHA
对某个指定的SHA打tag,默认是HEAD
git push origin v1.2
git push origin --tags
默认情况下是不会将tag的信息送到远端的。
第一的命令将某个指定的tag送到远端。
第二个命令将所有的tag送到远端。
13. Remote Repository
这个网上可以提供建立一个免费的git的repo
remote repo是用来多个人合作的。恩。。。,比较高级。
显示remote repo的信息
git remote
git remote -v
git remote show origin
添加别的remote 库
git remote add localname URL
也就是用这个localname 来代表URL
然后就可以从remote中下载代码
git fetch localname
默认glone后local的HEAD是track在origin/master上的,
所以如果你想要work on别的branch,需要先在本地建立一个branch
git branch --track feature origin/feature
这个意思是本地有个叫feature的branch,这个是track origin/feature的。
查看remote的情况
git remote show origin
上传changes,如果你有权限,你可以上传自己的更新到remote
git push origin master
意思是push到 origin这个远端树的master 分支上
git push origin :master
是删除remote的分支
下载别的更新?
git pull
下载了更新就直接merge了
当本地的git仓库更新后,我们需要与远端server上的仓库同步。
一般这么做
git fetch 将同步一下状态
git fetch -p 可以清空远端已经不用的分支
git branch -v 可以看到本地仓库中分支的状态。
git branch -av 可以看到远端和本地分支的状态
git checkout branchname 换到你想要更新的local branch上
git rebase origin/branchname 这样可以将本地做的commit 取下,并重新apply到最新的地方。
14. Some Tips
1. 假如编辑到了某个版本,发现某个功能不起作用了,或者有bug了。但是自己知道之前的某个版本是好的。
git bisect start
git bisect bad 现在这个版本是坏的
git bisect good good_commit good_commit这个版本是好的
接下来编译,测试。 如果是好的
git bisect good
如果还是不好
git bisect bad
这样git都会给你输出某个中间的版本让你继续测试。
找到了错误,用
git bisect reset 恢复到原先的版本。
2. git 命令在bash中自动补全
将git-completion.bash 拷贝到 /etc/bash_completion.d/git
3. git alias
git config --global alias.co checkout
4. 用git 打包
git archive master | gzip > master.tar.gz
把master这个branch打包了。
5. cleanup
git用得时间多了,会变慢。 那么可以用下面的命令优化一下。
git gc - Cleanup unnecessary files and optimize the local repository
git-repack - Pack unpacked objects in a repository
阅读(1238) | 评论(0) | 转发(0) |