notes-Learn-Git-Branching
book
blog
Git bash常用命令_u010897406的博客-CSDN博客
git remote add origin_Git极简教程(2)–remote级别的操作_weixin_39775127的博客-CSDN博客
Git中 fork, clone,branch - 喆星高照 - 博客园 (cnblogs.com)
exercise
github
给搜索加条件:
stars:>100 location:china
注意事项
git push origin xxx
之前需要先切换到 xxx 分支然后再提交
使用git push没有报错,但是远程仓库没有更新的问题_YBan10032的博客-CSDN博客
快速开始
git init
git config --global "username"
git config --global "xxx@xxx"
ssh-keygen -t rsa -C "comment" #-t:type, -C:备注, -f: 生成的文件名(处非加上绝对地址,否则存在当前文件夹内) ,私钥需修改安全权限
ssh -T git@github.com #c
git status
git remote add origin xxx #origin 作为 xxx 的别名,clone 后 origin 已经是 clone时用的仓库链接
git branch xxx
git checkout branch
git add [fileName | .]
git commit -m "comment"
git pull origin master # 拉取远程仓库的 master 分支
git push origin master
操作预览
git commit
--amend
-a
--all
-am
-m
git cherry-pick
git pull
--rebase
git fakeTeamwork
git clone
git remote
-v
git fetch
git branch
-d
-D
-f
--force
-m # git branch -m new_branch_name | git push --delete origin old_branch_name
-a
-r
-u # git branch -u origin dev -u表示设置推送到远程的默认分支 dev
--contains
git add
git reset
--hard
--sort
git revert
git merge
--no-ff
git rev-list
git log
git show
git rebase
-i
--slouting-ordering
--interactive-test
--aboveAll
-p
--preserve-merges
git status
git checkout
-b
-B
-
git status
--force
git describe
git tag
-d
git switch
-c
-
git cherry-pick aa bb cc ...
将记录哈希值为aa bb cc等几条记录复制到当前记录(HEAD或者*所指的记录)后面。
撤销操作
git revert
产生一个新的提交,当前记录会回到之前某次提交的状态,但历史不变
意会一下:A->B->C->D->E == git revert C
==> A->B->C->D->E->C’ , C’ 的版本状态与C相同。
移除提交
git reset aa
让最新提交的指针(HEAD)回到之前的某次提交(哈希值为)处,之后的历史记录均抹去。
D->E->A->B->C == git reset A
==> D->E->A 直接回到A版本的状态
撤销当前分支的变化
你在当前分支上做了几次提交,突然发现放错了分支,这几个提交本应该放到另一个分支。
意会一下:类似插眼,回退到主线继续工作。
# 新建一个feature分支,指向当前最新的提交
# 注意,这时HEAD依然停留在当前分支
git branch feature
# 切换到这几次提交之前的状态
git reset -- hard [当前分支的分岔处]
# 切换到feature 分支
git checkout feature
上面的操作等于是撤销当前分支的变化,将这些变化放到一个新建的分支。
rebase
优点
- 使提交树更简洁,都在一条线上。
缺点
- 修改了提交树的历史,让人分不清提交记录的先后。
应用场景
1.整合提交记录
git rebase -i HEAD~3
,修改对应单词为s
整合多条提交记录为一条,注意:rebase不要整合已push的记录
2.在另一分支上重新提交对应(本)分支
git rebase aa bb
git rebase aa
rebase: Reapply commits on top of another base tip
作用:将记录B 及 在其分支上之前的记录全部复制到记录A后面。(复制的顺序时从前往后)
参数:aa、bb均可用记录的哈希值、branch名或者相对位置(HEAD~)来指定。
只有一个参数时,时将当前记录(HEAD) 及 所在分支上的前面几项全部复制到记录aa后面。
git rebase -i aa bb
或git rebase --interactive address
加上-i参数后git会打开一个交互界面,可作三个操作:调整顺序、不添加某项记录、合并提交。
3.避免产生分支
git fetch origin dev
git rebase origin/dev
用fetch+rebase代替pull,来避免不必要的分叉。
解决rebase产生的冲突后,继续rebase
git rebase --continue
git branch -f aa bb
用aa强制命名记录B(哈希值为bb),若分支名aa已存在且指向其他记录,则将分支名改为指向记录B
git merge [branch name]
将记录A合并到当前分支来, a可以是记录的哈希值或分支名。
git fetch origin dev + git merge origin/dev= git pull origin dev
git fetch origin dev + git rebase origin/dev= git pull --rebase 或 git pull
同一分支上,旧版本分支同步到新版本记录上的指令:merge = rebase = checkout -b = branch -f a b
给记录b命名为a
git checkout -b [your-branch-name]
在当前记录处(HEAD)创建一个新的分支同时切换到新创建的分支
remote tracking属性
该属性决定了本地分支与远程分支的关联关系,例如main分支更新记录并push到远程仓库,远程仓库关联的分支会同步这次更新。
remote tracking属性是可以设置如下指令:
git branch -u origin/main foo
git branch -u origin/main
使分支foo跟踪origin/main分支
HEAD就在foo上时可省略foo
git checkout -b <your-branch-name> <your-origin-branch-name>
在当前记录处(HEAD)切换到新创建的分支同时让其跟踪远程仓库在本地用于同步的一个分支。
git push <remote> <place> #1
git push <remote> <source>:<destination> #2
git push <remote> :<destination> #3
1.参数place表示要推送的分支
2.:表示要将本地source分支的提交记录同步到远程的destination分支上
如:git push origin bugFix:main
3.:<destination>
可以删除远程仓库上的整条destination分支
git fetch <remote> :<destination>
在本地仓库当前位置添加destination分支
git -道
https://git-scm.com/book/en/v2/Getting-Started-What-is-Git%3F
object datebase
blob object, tree object, commit object
git -术
remote
git remote set-head origin -d
#删除origin/HEAD reference
origin/HEAD是远程仓库的HEAD引用,默认指向默认主分支(origin/master),一般不对其修改,故在本地可删去。
checkout
checkout : the place in a supermarket where you pay for the goods you have
注:checkout是个名词,意思是当你选好(集齐)要买的东西后,到商场的结账台处结账。在git中就是设置你做(集齐)了一堆修改后要将记录提交到的地方。
branch
提交记录图
git log --pretty --graph
git log --graph --pretty=format:"%h %s" #只显示的内容:%h表示哈希值,%s表示提交的记录信息
展示提交记录分支图,--pretty
可由--oneline
等价其替换。
回到未来
git reflog
对回退到之前的版本作恢复,恢复到之后的版本
设置版本
git reset --hard <版本号>
将整个项目设置到对应版本号下的版本
取消工作区的修改
git chekout -- <fileName>
对已修改未add的文件作恢复操作
删除分支
git branch -d <branchName>
删除对应分支
给远程仓库起别名
git remote add origin <url>
给远程仓库url取别名为origin,(默认时–local)
推送分支到远程
git push -u origin dev
将本地dev分支推送到远程仓库origin中,-u
表示设置推送到远程的默认分支为dev,下次直接输入git push
即可推到该分支上,不加-u
表示手动指定推送到对应分支上。
标签
git tag -a v1 -m '第一版本XXX'
git push origin --tags
快速解决冲突
1.beyond compare
2.在git中配置
git config --local merge.tool [name]
git config --local mergetool.path '[app address]'
git config --local mergetool.keepBackup false
3.应用beyond compare 解决冲突
git mergetool
gitflow工作流
Git 在团队中的最佳实践–如何正确使用Git Flow - 敏捷的水 - 博客园 (cnblogs.com)
Pull Requests - 简书 (jianshu.com)
线上分支、测试分支、dev分支、功能分支、bug分支
功能分支通过pull request上传到dev分支
git chekout -b dev
git push origin dev
配置
.git/config
- 项目配置文件:
项目/.git/config
git config --local user.name 'xxx'
git config --local user.email 'xxx'
- 全局配置文件:
~/.git/config
git config --global user.name 'xxx'
git config --global user.email 'xxx'
- 系统配置文件:
/etc/.git/config
git config --system user.name 'xxx'
git config --system user.email 'xxx'
##需要root权限
免密登录
URL实现
https://用户名:密码@github.com/xxx/xxx
git remote add origin https://用户名:密码@github.com/xxx/xxx
git push origin master
SSH实现
SSH-keygen用法 - 杨浪 - 博客园 (cnblogs.com)
1.生成公钥和私钥(默认放在 ~/.ssh目录下, id_rsa.pub公钥,id_rsa私钥)
ssh-keygen -t rsa
2.拷贝公钥内容,并设置到github中
3.在git本地中配置ssh地址
git remote add origin git@github.com:xxx
4.以后使用
git push origin master
git自动管理凭证
操作系统自带密钥管理
gitignore忽略文件
让git不再管理当前目录下的某些文件。
*.h //表示.h类型文件都ignore掉
files/ //表示某个文件夹
!a.h //表示除了a.h文件都忽略
*.py[c|a|d] //所有以.pyc、.pya、.pyd结尾的文件
参考http://github.com/github/gitignore
github任务管理相关
- issues:文档以及任务管理
- wiki:项目文档
git底层认识
先来个不错的文章:https://www.cnblogs.com/tanshaoshenghao/p/14200420.html
echo "version" > file.txt
#用echo创建文件,>表示覆盖写入,>>表示下一行追加写入
git hash-object -w file.txt
#将file.txt的内容以object的形式写入object数据库,并计算出对应的哈希值,哈希值前两位为文件名,之后的值为内容
#-w表示写入,-t用于指定类型,默认时blob类型
find .git/objectives/ -type f
#查看object数据库的内容
#-type用于指定类型,f表示文件
git cat-file (-p|-t) [hash]
#-p:查看object的内容,-t:查看文件的类型(blob、tree)
#hash至少输入前4位
背景
其他版本控制系统
SVN vs CVS are both version control files. They are mostly used by teams that are collaborating on a single project.SVN stands for SubVersioN, and CVS stands for Concurrent Versions System. They allow the team members to keep track of all changes made and know who is developing what.
difference betweent CVN and SVN :https://www.educba.com/svn-vs-cvs/