git创建本地分支,推送本地分支到远程库
创建本地分支后,应当立刻push到远程库,这样远程库才有新分支的信息,否则后面开发分支管理困难
git checkout -b new_branch
git push origin new_branch:new_branch // 在远程库对应创建一个分支
执行上述命令后,后续的git pull和git push都能直接操作,都在自己的分支上开发。
自己在分支A,需要同步分支B的更新
例如自己在开发分支dev,而有时候master分支更新了公共代码,需要同步时,在本地库的操作需要先切换到master分支,pull下最新的代码,然后切回自己的dev分支,将master分支合并到dev分支:
git checkout master
git pull
git checkout dev
git merge master
这样,就可以实现代码和别人的修改同步,所以在merge request之前,应当先进行上述操作,保证非自己修改的代码文件和最新的保持一致。
【本地代码库回滚】:
git reset --hard commit-id :回滚到commit-id,讲commit-id之后提交的commit都去除
git reset --hard HEAD~3:将最近3次的提交回滚
【远程代码库回滚】:
这个是重点要说的内容,过程比本地回滚要复杂
应用场景:自动部署系统发布后发现问题,需要回滚到某一个commit,再重新发布
原理:先将本地分支退回到某个commit,删除远程分支,再重新push本地分支
操作步骤:
1、git checkout the_branch
2、git pull
3、git branch the_branch_backup //备份一下这个分支当前的情况
4、git reset --hard the_commit_id //把the_branch本地回滚到the_commit_id
5、git push origin :the_branch //删除远程 the_branch
6、git push origin the_branch //用回滚后的本地分支重新建立远程分支
7、git push origin :the_branch_backup //如果前面都成功了,删除这个备份分支
方法一:
1、新建backup分支 作为备份,以防万一
git branch backup
2、将本地的backup分支 推送到远程的backup
git push origin backup:backup
3、本地仓库彻底回退到xxxxx版本,xxxxx版本之后的commit信息将丢失
git reset --hard xxxxx
4、删除远程的master分支 (注意master前有个:)
git push origin :master
主要远程仓库的master如果是保护分支将报错,请去掉对分支的保护设置:
remote: GitLab: You are allowed to deleted protected branches from this project. To http://gitlab.mogujie.org/shihao/afanty.git ! [remote rejected] master (pre-receive hook declined) error: failed to push some refs to 'http://gitlab.mogujie.org/xxxx/xxxx.git'
5、重新创建远程master分支(这跟第1次提交本地代码库给远程仓库的命令一样)
git push origin master
方法二:
1、本地代码回滚到上一版本(或者指定版本)
git reset --hard HEAD~1
2、加入-f参数,强制提交,远程端将强制跟新到reset版本
git push -f
更详细的代码库回滚方法:
https://zhuanlan.zhihu.com/p/56843134
git diff两个分支
Git diff branch1 branch2 --stat //显示出所有有差异的文件列表
Git diff branch1 branch2 文件名(带路径) //显示指定文件的详细差异
Git diff branch1 branch2 //显示出所有有差异的文件的详细差异
git解决合并的冲突
https://www.liaoxuefeng.com/wiki/896043488029600/900004111093344
冲突场景,本地在自己的分支修改了文件A,同事也修改了文件A并push到master远程分支,为了同步同事的修改,本地checkout master,git pull,checkout my_dev,git merge master时出现冲突,合并失败,在vscode中可以看到文件冲突的内容。
形如:

在vscode中可以选择接受要合并的分支内容还是自己本地的内容,最好的方法,防止出问题,就是把自己的代码先复制好,然后accept incoming changes,然后在粘贴回自己的代码。
这样就算是解决一个冲突,对每个冲突都处理之后,然后本地git add 这些冲突的文件,git commit -m "fix conflict"就完成了这次merge。要注意commit之后就不需要再merge了,因为merge发生冲突的时候是应把冲突文件以外的文件都合并好了,我们只需要解决冲突然后本地commit就好。
在发生冲突时,git status也可以看本次merge的情况,有哪些文件已经merge好,哪些文件是冲突的。
https://www.cnblogs.com/lsgxeva/p/9485707.html
拉取他人分支
例如别人远程分支是dev2,你的本地分支是my_dev,没有关联到这个分支
最简单的办法就是创建一个新分支,然后关联dev2,pull下来之后再合并到my_dev
可能有更好的做法,可以继续学习
git fetch 和git pull
使用结果上,git fetch + git merge == git pull
git pull会自动拉取远程仓库中最新的代码并且自动合并,例如会常见到fast-forward
而git fetch则是将代码拉到本地,不执行合并,这样更安全,用户需要手动合并,合并的时候就会知道有哪些地方冲突了。
最直白的使用方式,假设同事A在远程库有自己的分支dev_A,而你的分支在dev_B,他有新的更新,并且你想在本地仓库合并他的代码,那么:
git fetch origin dev_A:dev_A_local
git checkout dev_B
git merge dev_A_local
第一行代码会fetch远程的dev_A分支,并和本地的dev_A_local分支关联,如果dev_A_local不存在,就会自动创建一个新分支,如果存在,则会自动合并。然后就执行正常的合并操作,合并到自己的分支。

https://www.cnblogs.com/lsgxeva/p/9485707.html
上面的链接讲了git常用的操作 十分详细
包括本地分支和远程分支关联等等操作
本地没有某个分支,拉取远端库的分支
首先要git pull一下,让本地知道远端有新的分支,更新分支信息
然后
git checkout -b ck_dev origin/ck_dev
origin/ck_dev是远端的分支,这个命令会自动在本地创建分支ck_dev,并切换过去,同时绑定了远端的ck_dev分支,pull和push操作都和这个远端分支关联
gitignore不生效的原因

一定要求文件是没有被tracked才可以。


正确的做法:
git rm --cached file_name // git rm -r --cached dir_name
git commit -m "rm no need file"
git push
https://segmentfault.com/q/1010000000430426
https://shiyousan.com/post/636470505667009340
https://zhuanlan.zhihu.com/p/102890728
当前分支有修改,想要切换分支
如果不在当前分支commit,直接checkout的话,会把当前的修改一起带到新的分支,可以理解成整个分支的文件状态都会移到新分支。
可能当前分支的代码还没有开发完,要切去别的分之,不想这么多次commit,那么可以使用stash命令。
https://www.cnblogs.com/tocy/p/git-stash-reference.html
最简单的情况就是使用git stash,能够保存当前的状态,又不会增加commit的次数,stash之后,checkout到新分支不会带上现有的修改,并且回到原分支之后,可以使用git stash pop来恢复,使得git status能看到stash前的git变更。
更详细的可以看上面的url。
本地、远端版本回退
本地回退:
git relog找到commit的标识符
git reset --hard 标识符
远端回退:
在操作了本地回退之后,执行:
git push -f origin branch_name即可
diff
git diff hash1 hash2
git diff hash1 hash2 -- filename
hash1/2是commit的标签值
git submodule
https://git-scm.com/book/zh/v2/Git-%E5%B7%A5%E5%85%B7-%E5%AD%90%E6%A8%A1%E5%9D%97
git Submodule 是一个很好的多项目使用共同类库的工具,他允许类库项目做为repository,子项目做为一个单独的git项目存在父项目中,子项目可以有自己的独立的commit,push,pull。而父项目以Submodule的形式包含子项目,父项目可以指定子项目header,父项目中会的提交信息包含Submodule的信息,再clone父项目的时候可以把Submodule初始化。
https://segmentfault.com/a/1190000003076028
git submodule add git@github.com:jjz/pod-library.git pod-library
git submodule add后面可以直接给子模块repo的地址
在Submodule的目录中,使用git和单独的一个项目是一样的,注意更新Submodule的时候如果有新的commit id产生,需要在父项目产生一个新的提交,pod-libray文件中的 Subproject commit会变为最新的commit id。
父项目是有自己的git信息,子模块有自己的git信息,两个是独立的,我们进入子模块的目录,修改文件,再push,就会对子模块的git repo进行更新,此时需要回到父模块目录下,git add git commit来更新子模块信息的变更。

git tag
打标签,等价于给一个commit起别名、引用,方便我们在某一天需要切换到该分支进行开发的时候,能够快速切换,并且还能基于这个分支创建新的bugfix分支。
https://git-scm.com/book/zh/v2/Git-%E5%9F%BA%E7%A1%80-%E6%89%93%E6%A0%87%E7%AD%BE
git tag -l 或 git tag
可以查看现在repo下的所有tag
git tag -l "tag_name*" 可以正则匹配查看符合条件的tag
tag分两类,一类是轻量tag,一类是附注tag(annotation)
附注tag会带上创建人的所有信息,包含打标签者的名字、电子邮件地址、日期时间, 此外还有一个标签信息,并且可以使用 GNU Privacy Guard (GPG)签名并验证。 通常会建议创建附注标签。
git tag -a v1.4 -m "tag version v1.4"
# -a 就是附注tag的意思

轻量标签,不需要-a -m 的选项,直接打
git tag v1.4

如果以前的提交没打过标签,想补打,也是可以的

git tag -a v1.2 commit_id
推送标签,git tag执行完只在本地生成了tag,需要推送到远端,共享,则执行下面的命令:
git push origin v1.4
如果不想每次都输入tag name,想一次全部推送,则
git push origin --tags
删除标签,本地
git tag -d tag_name
远端删除标签
git push origin --delete tagname
从标签切出新的开发分支
git checkout -b new_version v1.4
这时候创建了新的分支new_version,可以在这个分支上开发,实现快速切到某一commit的继续开发

关联远程仓库
git 配置ssh 这里不说了
在本地目录下 执行 git init 创建本地git仓库
在远程创建好一个仓库后 执行
git add remote origin 仓库地址
完成关联,随后推送分之
git push --set-upstream origin master
完成第一次推送,后续直接git push完事(推送前注意分支)