推荐一个学习git的教程:
廖雪峰:
http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000
1.本地搭建仓库
初始化建立新仓库:git init
关联一个远程仓库:git remote add origin git@server-name:path/repo-name.git
克隆远程仓库到本地:git clone (远程仓库地址)
2.分支操作
查看当前分支:git branch
创建新分支:git branch (分支名)
删除分支:git branch -d (分支名)
删除远程分支:git push origin --delete (分支名)
切换分支:git checkout (分支名)
合并指定分支的指定文件:git checkout (分支名) 文件名(文件夹名/*)
创建并切换分支(创建的是当前所有分支的副本):git checkout -b (分支名)
创建并切换分支(创建的是指定远程分支的副本):git checkout -b (分支名) origin/(分支名)
合并指定分支到当前分支:git merge (分支名)
(合并发生冲突时,手动解决发生冲突的文件)
合并指定commit到当前分支:git cherry-pick commitID
(不同分支commitID不同,所以不用指定分支名就能自动定位到某个分支提交的commit)
使用–no-ff方式合并并提交:git merge --no-ff -m "message" dev
强行删除没有合并过的分支:git branch -D (分支名)
把某个文件夹提取为单个分支:git subtree split --prefix=docs --squash -b docs
多个commit合并为1个(执行完后在vim中把第二个开始的pick改为squash):git rebase -i 最后一个commitid
3.版本/修改操作
回退到以前版本:git reset --hard HEAD^
通过commit id版本回退(比加–hard会保留文件的修改):git reset --hard commit_id
丢弃工作区的修改,或误删文件时(版本库中没被删除时)恢复文件:git checkout -- (filename)
丢弃暂存区修改,把暂存区的最新一次修改撤销掉,重新放回工作区:git reset HEAD (filename)
工作区删除文件后,在版本库中也删除该文件:git rm (filename)
4.提交到本地仓库
将文件添加到暂存区:git add (filename)
(可以用.表示所有都添加)
将暂存区所有内容提交到当前分支:git commit -m "this is a message about this commit"
5.和远程仓库操作
关联后,第一次推送到远程仓库:git push -u origin master
推送最新修改到远程仓库:git push origin master
抓取远程最新提交:git pull
本地分支和远程分支建立连接:git branch -set-upstream dev origin/dev
强制覆盖远程仓库:git push origin master --force
删除远程分支:git push origin --delete 分支名称
6.储藏区
储存当前工作区:git stash
恢复stash:git stash apple
删除stash:git stash drop
恢复stash并删除stash:git stash pop
7.标签操作
给分支当前状态打标签:git tag (标签名)
给分支历史commit打标签:git tag (标签名) commit_id
创建带有说明的标签:git tag -a (标签名) -m "message" (commid_id)
删除标签:git tag -d (标签名)
将某个标签推送到远程:git push origin (标签名)
推送所有没推送到远程的标签:git push origin --tags
删除推送到远程的标签(先在本地删除该标签):git push origin :refs/tags/(标签名)
8.查看信息操作
查看工作区状态(有没有改变、改变有没有提交等):git status
查看文件修改内容:git diff (filename)
查看commit提交日志:git log
单行查看commit提交日志:git log --pretty=oneline
查看本地commit哪些没有push到远程:git cherry -v
查看命令历史记录(可以通过此方法查看commit id):git reflog
查看当前分支:git branch
查看分支合并图:git log --graph
查看储藏列表:git stash list
查看远程仓库信息:git remote
查看远程仓库详细信息:git remote -v
查看所有标签,结果按字母排序:git tag
查看某个标签信息:git show (标签名)
查看两个节点的区别:git diff 版本号1 版本号2
查看两个节点具体文件的区别:git diff 版本号1 版本号2 文件/文件夹名
9.配置操作
配置全局用户名:git config --global user.name (用户名)
配置全局用户邮箱:git config --global user.email (用户邮箱)
生成ssh密钥:ssh-keygen -t rsa -C (用户邮箱)
配置每个字符串的别名:git config --global alias.(别名) (被替换的名)
删除别名:直接到.git/config文件中的[alias]下删除
不将某些文件加入到版本控制中:创建.gitignore文件,把要忽略的文件名写进去
10.注意
①合并分支时,加上--no-ff参数就可以用普通模式合并,合并后的历史有分支,能看出来曾经做过合并,而fast forward合并就看不出来曾经做过合并。
②在团队开发中,master分支应该是稳定的,仅用来发布新版本。干活都在dev分支上,团队的人都将自己的分支和dev分支合并,等到某个时候,dev再和master合并。
③在开发中遇到bug要跳出当前分支去别的分支操作时,可以现在当前的工作区储藏起来
④在多人合作时,当git push到远程仓库失败时,是因为远程仓库比你当前本地仓库要新,所以要先git pull,拉去远程仓库最新版到本地,如果如冲突要先解决冲突,然后再重新add、commit、push;如果提示“no tracking information”,则说明本地分支和远程分支的连接关系没有创建,要先将本地分支和远程分支建立连接。
11. 常见错误
(1) fatal: refusing to merge unrelated histories
解决方法:
git pull origin master --allow-unrelated-histories
小结
当多人合作时,你的开发流程:
2017/1/4 更新
① 假设项目仓库为A,fork一份到自己的仓库,为B
② 将远程B仓库克隆到本地:git clone (远程仓库地址)
③ 进行修改,将修改添加到暂存区:git add (filename)或者git add ./
④ 将暂存区的文件都提交:git commit -m "message"
⑤ 检查本地仓库:git remote,你会发现有两个仓库origin是你自己的,upstream是你fork的即A
⑥ 拉去一份A仓库最新版到本地:git pull upstream master,如果有冲突的话解决冲突,没有冲突就表示两个自动合并了
⑦ 重新add和commit,即第③④步操作
⑧ 将合并后的分支推送到远程分支:git push origin master
⑨ 此时,代码被更新到你自己的仓库B,在github中发起一个pull request给仓库A
⑩ 等待仓库A的所有者进行合并就完成了