1. 采用clone、commit模式的开发方式
首先推荐一个个人认为比较好的git学习链接: http://www.ruanyifeng.com/blog/2014/06/git_remote.html ,以下是自己的git学习和工作总结。
git cherry-pick [commit-id]
将另一个分支中的提交commit-id合并到当前分支中的最后一次提交中,如果出现冲突进行提示。
git branch -d [local-branch-name]
删除本地分支名为local-branch-name的分支
git branch -D [local-branch-name]
强制删除本地分支名为local-branch-name的分支
git push命令解释如下:
git push 的完整命令为:git push <远程主机名> <本地分支名>:<远程分支名>
分支推送顺序的写法是<来源地>:<目的地>,所以git pull是<远程分支>:<本地分支>,而git push是<本地分支>:<远程分支>。
如果省略远程分支名,则表示将本地分支推送与之存在”追踪关系”的远程分支(通常两者同名),如果该远程分支不存在,则会被新建。
如果省略本地分支名,则表示删除指定的远程分支,因为这等同于推送一个空的本地分支到远程分支。
git push origin :master等价于git push origin –delete master表示删除远程分支
git push不会推送标签(tag),除非使用–tags选项,如:git push origin –tags
git push origin :[remote-branch-name]
删除远程服务器上分支名为remote-branch-name的分支
git fetch origin [remote-branch-name]
git fetch <远程主机名> <分支名>
该命令用于将远程主机名中的某个分支读取到本地,本地访问的方式为“远程主机名/分支名”,
从远程服务器获取remote-branch-name的最新分支到本地的origin/remote-branch-name中
在非bare的git仓库中,如果你要同步的本地跟踪分支是当前分支,就会出现拒绝fetch的情况。也就是说不可以在非bare的git仓库中通过fetch快进你的当前分支与远程同步。意图可能是:如果本地数据被修改过了,这种同步的fetch会更改本地的文件(相当于fetch后再checkout到某个commit点),可能影响当前未提交的的工作。
git log -p local-branch-name..origin/remote-branch-name
比较本地分支local-branch-name中的内容与远程分支remote-branch-name中的内容的区别
git merge origin/branch-name
读取到本地后可以使用git merge [更新分支名]或者git rebase [更新分支名]将更新的分支和本地的分支进行合并;
将本地分支branch-name的内容与下载到本地的最新分支origin/branch-name的内容进行合并
git pull origin [remote-branch-name]
git pull的完整命令为git pull <远程主机名> <远程分支名>:<本地分支名>,若是将远程分支与当前分支进行合并,则冒号后的本地分支名可以省略;
表示将远程分支remote-branch-name中的内容下载到本地origin/remote-branch-name中,同时通过git merge对origin/remote-branch-name中的内容和本地分支名为remote-branch-name的分支进行合并
Git会自动在本地分支与远程分支之间,建立一种追踪关系(tracking),在建立追踪关系的情况下可以省略远程分支名;使用git branch –set-upstream <本地分支名> <远程分支名>用于建立本地分支名和远程分支名的追踪关系,如git branch –set-upstream master origin/next用于在master和origin/next分支间建立追踪关系;
git pull –rebase <远程主机名> <远程分支名>:<本地分支名>还能将远程分支名和本地分支名进行合并;
git pull命令包括merge模式和rebase模式两种,如果不加–rebase命令参数则git pull采用的是merge模式,采用merge模式时会在代码图上出现无用的合并,因此采用rebase模式是git pull的一种较好的方式,具体使用时时使用git pull –rebase <远程主机名> <远程分支名>:<本地分支名>将远程分支中的代码pull到本地,并提示是否冲突,遇到冲突时该命令提示并停止,在用户使用git rebase –continue时完成代码从服务器到本地的合并和rebase处理,完成后代码提交图谱上成为一条直线后就可以使用git push提交代码了。
git pull –rebase <远程主机名> <远程分支名>:<本地分支名>可以进行分解为如下命令:
git fetch <远程主机名> <远程分支名>
git rebase <远程主机名>/<远程分支名>:此时如果遇到冲突需要解决后使用git rebase –continue继续完成rebase功能,如果需要停止该工作用git rebase –abort放弃rebase功能
完成后就可以进行git push <远程主机名> <本地分支名> <远程分支名>进行代码提交了(是一条直线哦)
也就是说应该尽量少用git merge命令,只要在出现重大分支需要合并的时候才用git merge进行代码合并功能操作。
在不小心弄错了,在本地出现了一堆untracked文件的时候,这些文件对本分支又没有用的时候,使用git clean -xfd能够清除本地分支中的这些无用文件,对于已经track并且已经commit的文件使用git reset进行清除,对于已经track但是没有commit的文件使用git checkout .就能够完成恢复。
git remote用于列出所有远程主机,git要求所有远程主机都必须指定主机名,git remote用于对远程主机名进行管理。
git rebase -i [commit-id]可以用于对commit-id之后的提交进行合并、修改等操作,完成后使用git rebase –continue可以完成操作。
2. 采用fork、pull request模式的开发方式
采用这种方式的一个关键点事origin代码库和upstream代码库同步的操作,个人认为比较好的学习链接是: https://help.github.com/articles/syncing-a-fork/ ,但是个人觉得补上我下面的第6条会更加完善。
对于采用先fork一个repository到本地,然后基于该repository进行开发,开发完成后将代码push到自己fork的repository库中,最后提交push request将自己提交的repository合并到remote repository这种开发模式的操作方式,我们在需要将远程代码库同本地代码库进行更新时,需要按照如下步骤进行操作:
1. 查看远程代码库的配置状态:git remote -v;
2. 添加fork远程的上游代码仓库:git remote add upstream [远程代码库地址],如git remote add upstream ssh://git@gitlab.qiyi.domain:10022/player/libs.git;
3. 从上游仓库 fetch 分支和各个commit,本地将会建立一个upstream/master的分支,使用的命令为:git fetch upstream;
4. 如果当前分支不在本地主分支,将当前分支切回到本地主分支:git checkout master
5. 把 upstream/master 分支合并到本地 master 上,就可以在不丢掉本地修改的内容的情况下完成同步:git merge upstream/master
6. 合并到本地master分支后,为了保证本地和自己fork的远程分支代码同步,通常还需要push到自己的远程分支中:git push origin master –force
对于开源项目,这种模式是较常用的开发模式。
目前在实际工程操作过程中发现,git fork时origin代码库拥有和upstream代码库相同的分支,并且用户在checkout分支时默认指向的分支是origin代码库中的分支,如果后续upstream代码库增加新分支后,用户只能fetch upstream后再checkout出新增加的分支,并使用git push origin将该分支提交到origin代码库,同时由于此时checkout出的新分支指向是upstream代码库中的分支,如果用户需要修改这个新分支的upstream分支需要使用以下命令对本地分支的upstream分支进行修改:
git branch –set-upstream 分支名 origin/分支名
自己使用git 2.8.4执行上述命令时,会提示不建议使用–set-upstream ,而是建议使用–track或–set-upstream-to参数,那就应该是如下命令:
git branch –track origin/分支名
或
git branch –set-upstream-to origin/分支名
添加远程代码仓库
git remote add
获取远程分支
git checkout -b branch_name upstream/branch_name
Caveat:
git add -A :stages All
git add . :stages new and modified, without deleted
git add -u :stages modified and deleted, without new
3. 常用后悔药
1. 跟踪了某些不想跟踪的文件后悔了,修改方式:
- 从git中删除不想跟踪的文件:git rm –cached [file_name]
- 从git中删除不想跟踪的目录:git rm –cached -r [dir_name]
- 编译.gitignore文件并增加不想跟踪的目录或文件:vim .gitignore进行编辑
Q&A
1. GitLab: You are not allowed to force push code to a protected branch on this project.
Project->Repository->UnProtect project
Enjoy Git. ^_^