note-of-git

聂鹏云
2023-12-01

notes-Learn-Git-Branching

book

Pro Git(中文版) (oschina.net)

Git - Reference (git-scm.com)

blog

Git bash常用命令_u010897406的博客-CSDN博客

git remote add origin_Git极简教程(2)–remote级别的操作_weixin_39775127的博客-CSDN博客

Git中 fork, clone,branch - 喆星高照 - 博客园 (cnblogs.com)

exercise

Learn Git Branching

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/

小知识点

clone与 fork 的区别

Git中 fork, clone,branch - 喆星高照 - 博客园 (cnblogs.com)

 类似资料: