the stupid content tracker
git是一个分布式的版本控制系统,是由伟大的程序员Linus开发而成。git的本意是饭桶,无用的人,烂人。
I’m an egotistical bastard, so I name all my projects after myself. First Linux, now git.
与传统的集中式版本控制系统相比,两者的区别是:集中式版本控制系统提取的是最新版本的文件快照;而分布式版本控制系统是把代码仓库完整地镜像下来。分布式的好处是任一机器发生故障,都能从其他任何一个镜像出来的本地仓库恢复。
犯的一些错误
- 提交代码的时候,有冲突,在没有弄清楚的情况下覆盖了别人的代码。
由于写的时候不是最新的代码,所以改动之后提交,发生了冲突,然后在没有和同事沟通的情况下,擅自解决冲突然后把别人的代码给覆盖了.
解决方法:
有新的小特性或者临时的Bug修复时的改动的时候最好是切一个新分支,或者hotfix分支,然后把最新的代码copy下来再改动,而不是在随便选一个过时的代码分支改动。
git的优点
-
速度
-
简单的设计
-
对非线性开发模式的强力支持(允许成千上万个并行开发的分支)
-
完全分布式
-
有能力高效管理类似 Linux 内核一样的超大规模项目(速度和数据量)
git基本操作
在安装好git后,我们就能愉快地使用这个强大的工具啦~
帮助
git help <verb>
初始化仓库
git init
克隆
git clone [url]
忽略文件
支持glob模式正则匹配
cat .gitignore
要养成一开始设置好gitignore的习惯,避免提交无用的文件
检查当前文件状态
git status -s
跟踪新文件
将修改的文件从工作目录添加到本地暂存区
git add file
比较当前工作目录的文件和暂存区的差异
//更新尚未暂存的内容
git diff
//暂存暂未提交的内容
git diff --cached | --staged
//查看当前系统支持哪些Git Diff 的插件版本
git difftool --tool-help
提交更新
git commit -m 'added new benchmarks'
跳过使用暂存区域提交
git commit -a -m 'added new benchmarks'
移除文件
//移除尚未暂存的本地文件
git rm README
//移除已经暂存的文件,并连带本地文件一起删除
git rm -f README
//移除暂存区的文件,但是保留在工作目录中
git rm --cached log/\*.log
移动文件(重命名)
git mv README.md README
查看提交历史
git log
重新提交
//第二次提交将代替第一次提交
git commit -m 'initial commit'
git add forgotten_file
git commit --amend
取消暂存
git reset HEAD README.md
撤销对文件的修改
会将文件还原成最初的样子
git checkout -- [file]
PS:git中任何已提交的东西几乎都是可以恢复的,而未提交的东西丢失后很可能再也找不到了。
查看所有远程仓库
如果是git clone克隆下来的仓库默认名称为origin
git remote -v
查看某一个远程仓库
git remote show [remote-name]
添加远程仓库
git remote add <shortname> <url>
从远程仓库拉取数据
git fetch数据拉到本地仓库,但不会自动合并或修改当前的工作,当准备好时必须手动将其合并入你的工作。
git fetch [remote-name]
如果你有一个分支设置为跟踪一个远程分支(默认git clone会将本地master分支跟踪远程仓库的master分支),git pull会拉取远程仓库的数据并自动尝试合并到当前所在的分支
git pull
推送到远程仓库
pull request (PR)
只有当有远程服务器的写入权限,并且之前没有人推送过时,这条命令才会生效。如果你和其他人同一时间克隆,他们先推送到上游然后你再推送到上游,你的推送就会被拒绝。必须先将他人的工作拉取下来并将其合并进的的工作之后才能推送。
git push [romete-name] [branch-name]
远程仓库的移除与重命名
git remote rename pb paul
git remote rm paul
打标签
git tag //列出标签
git tag -l 'tagname' //列出指定标签
git tag -a v1.4 -m 'my version 1.4' //创建标签1.4
git show v1.4 //查看标签的提交信息
git log --pretty=oneline
git tag -a v1.2 9fceb01 //后期打标签,找到log里的每次提交的校验和
git push origin v1.4 //将标签推送到共享服务器上
git push origin tags //将所有不在远程服务器上的标签都推送上去
git checkout -b version1.4 v1.4 //对特定的标签创建一个新分支
git分支
Git的杀手级特性:分支模型。分支意味着你可以把你的工作从开发主线上分离开来,以免影响开发主线。理解和精通这一特性,你便会意识到git是如此的强大而又独特,从此真正地改变你的开发方式。
git branch test //创建分支test
git checkout test //分支切换
git checkout master
git merge test //合并master和test分支
git branch -d test //删除分支
git branch //列出当前所有分支
git branch -v //列出每一个分支的最后一次提交
git branch --merged/--no-merged //查看哪些分支已合并到/未合并到当前分支
分支开发工作流:
- 长期分支:对于复杂庞大的项目,一般在master分支上保留完全安全稳定的代码(有可能是已经发布或者即将发布的代码)。还有一些名为develop或者next的平行分支,被用来做后续持续开发或者测试你稳定性,这些分支不必保持绝对稳定,但是一旦达到稳定状态就可以被合并入master分支了。
- 特性分支:对于任何项目规模都适用。特性分支是一种短期分支,它被用来实现单一特性或者相关工作。
利用远程跟踪分支
git remote show origin //获取远程分支的更多信息
git push origin serverfix:awesomebranch //将本地的serverfix推送到远程仓库中awesomebranch仓库中
git fetch origin //抓取新的远程跟踪分支时,只有一个不可修改的origin/awesomebranch的
git merge origin/awesomebranch //将awesomebranch分支中的工作合并到当前所在的分支
git checkout -b serverfix origin/awesomebranch //检出远程分支生成一个用于工作的本地分支
git checkout --track origin/awesomebranch //上面的快捷方式
git branch -u/--set-upstream-to origin/awesomebranch //修改正在跟踪的上游分支
git branch -vv //查看设置的所有跟踪分支
git fetch --all;git branch -vv //查看最新的领先与落后数字
git pull //相当于git fetch;git merge 最好显示地使用fetch和merge命令好一些
git push origin --delete awesomebranch //删除远程分支
变基(rebase):
可以使用rebase命令将提交到某一分支的所有修改都迁移到另一分支上。使用变基使得提交历史更加简洁。但是,不要对你的仓库外有副本的分支执行变基。
git checkout experiment
git rebase master //将experiment分支的修改应用到master分支上
git checkout master
git merge experiment //此时是fast-forward合并
储藏与清理
当在某个分支上做了修改又不想提交的时候,可以将更改的储藏推送到栈上。
git stash //提交储藏
git statsh list //查看已经储藏的列表
git stash apply xxx //将储藏应用
git stash apply --index // ???
git stash drop xxx //移除储藏
git stash pop //应用储藏并立即从栈上扔掉它
git stash --keep-index //不要储藏git add的东西
git stash -u //储藏跟踪和未跟踪的文件
git stash --patch //交互式地提示哪些改动想要储藏,哪些改动需要保存在工作目录中
凭证存储
如何避免每次推送的时候输入用户名和密码?
设置多个账号
参考:
http://www.cnblogs.com/tinyphp/p/5025311.html
https://www.jianshu.com/p/89cb26e5c3e8