Git使用指南

图解git四大分区1.png

图解git四大分区2.png

1. 推送到远程仓库

将本地项目初始化到远程dev branch上

> cd 
> git init
> git checkout -b dev   # create a new branch dev
> git add .
> git commit -m "First commit"
> git remote add origin 
> git push -u origin dev
> git log --since="2018-01-01" --before="2021-01-22" --author="yuchensun" --pretty=tformat: --numstat | awk '{ add += $1; subs += $2; loc += $1 - $2 } END { printf "added lines: %s, removed lines: %s, total lines: %s\n", add, subs, loc }'

拷贝一个仓库的内容到另一个仓库

git clone --bare https://github.com/exampleuser/old-repository.git # 产生叫old-repository.git的文件夹
cd old-repository.git
git push --mirror https://github.com/exampleuser/new-repository.git

查看仓库远程地址

> git remote get-url origin

修改仓库远程地址

> git remote set-url origin 

2. 将远程信息同步到本地

git fetech

3. merge

合并分支A到B

> git checkout A
Switched to branch 'A'
> git pull origin A # 确保本地A分支已经更新到最新
From 
 * branch            A        -> FETCH_HEAD
Already up to date.
> git checkout B
Switched to branch 'B'
> git pull origin B 
From 
 * branch            B        -> FETCH_HEAD
Already up to date.
> git merge A
Auto-merging ...
CONFLICT (content): Merge conflict in ...
(打开VSCode手动解决冲突)

也可以使用git merge A B来代替git checkout B; git merge A这两句

4. 回滚删除某一次提交(不小心上传了密钥时使用)

(把当前进度备份保存好)
git reset --hard  // 将HEAD指向要删除的提交的前一次提交 
git push origin HEAD --force // 强制推送到远端,想要删除的提交就会被抹去
(将最新进度拷贝回本地仓库)
git push origin dev // 重新提交最新进度

5. cherry-pick

单独挑选需要的commit合并入当前分支

git checkout master
git cherry-pick 

单独需要的commit区间合并入当前分支

git checkout master
git cherry-pick commit_id_1..commit_id_100
# 左开右闭,包含commit_id_100,不包含commit_id_1

cherry-pick默认每摘取一个commit就会提交一次生成一个新的commit id,如果希望摘取所有后自己手动commit,则可以使用参数-n

git checkout master
git cherry-pick -n commit_id_1..commit_id_100
git commit -m "pick features"

6. diff比较不同

git diff (): 当工作区有改动,暂存区为空,diff的对比是“工作区与最后一次commit提交的仓库的共同文件”;当工作区有改动,暂存区不为空,diff对比的是“工作区与暂存区的不同文件”,可指定文件

git diff --staged / git diff --cached: 显示暂存区(已add但未commit文件)和最后一次commit(HEAD)之间的所有不相同文件的增删改

git diff branch1/commit_id branch2/commit_id (): 比较两个branch/commit最后一次commit的文件的详细差异,可指定文件

git diff branch1/commit_id branch2/commit_id --stat: 罗列出两个branch/commit最后一次commit所有有差异的文件(简要)

7. 分支

查看所有分支

git branch -a

查看所有远程分支

git branch -r

查看所有本地分支到远程分支的映射

git branch -vv

新建分支

# 新建远程分支同名的本地分支
git checkout  
# 只创建本地新分支,不会关联到远程分支
git checkout -b  
# 有时候只写git checkout 未必能关联到正确的远程分支
# 需要具体指明
git checkout -b  origin/

删除分支

# 删除本地分支
git branch -D  
# 删除远程分支
git push origin --delete  

8. git config

git的config有三级(优先级依次降低):local, global, system
查看config

git config --local -l
git config --global -l
git config --system -l

设置文件换行格式

git config --global core.autocrlf true # push时自动地把行结束符CRLF转换成LF,pull时把LF转换成CRLF。Windows上常用。
git config --global core.autocrlf input # push时把CRLF转换成LF,pull时不转换
git config --global core.autocrlf false # 无论pull还是push都不转换

git会默认忽略检查文件名的大小写是否变化,这时候就需要设置config里的ignorecase参数

git config core.ignorecase  # 查看是否忽略了文件名大小写
git config core.ignorecase false  # 设置是否忽略了文件名大小写

9. rebase

git rebase 和git merge 做的事其实是一样的。它们都被设计来将一个分支的更改并入另一个分支,只不过方式有些不同。

merge会将两个分支保留两个分支的commit节点,并在最后创建一个合并用的commit节点。
rebase则是直接将一个分支的最新修改靠背了一份,作为另一个分支修改的基底。
因此,rebase不适合利用在共享的分支上,但可以使用在合并最新更新到自己的开发分支上,可以保持线性,避免混乱。
详细可看这里。
另外有基于rebase的合并部分代码到master的实现。

10. git submodule

git submodule可以将一个仓库引用到另一个仓库中

添加子模块

git submodule add  
# 如[email protected]:myprojects/child.git app/child

此时项目仓库中会多出.gitmodules文件和对应的仓库目录

添加后如果从远程clone父仓库,子仓库并不被一起被拉去,需要使用初始化和更新命令

git clone [email protected]:myprojects/parent.git 
cd 
git submodule init
git submodule update

另一种方法为直接递归拉取

git clone [email protected]:myprojects/parent.git --recurse-submodules

还有一种

git clone [email protected]:myprojects/parent.git 
git submodule update --init --recursive

如果将包含子仓库的branch merge到不包含子模块的branch,也需要重新git submodule initgit submodule update

此时进入子仓库目录内,可以发现git版本信息等变成了子仓库的信息
修改子模块后,需要先在子仓库目录内推送至远程,然后再把这个依赖更新信息推送到父仓库

删除submodule时,需要清理几个地方:

  1. 删除.gitmodules中的相关信息
  2. 删除.git/modules中的相关目录
  3. 删除.git/config中的相关引用
  4. 执行`git rm –cached·将子模块所在的文件从git中删除

可以使用官方的

git submodule deinit 
# 效果相当于删除了.git/config中的信息
git rm 
# 效果相当于删除了.gitmodules中的信息

不过.git/modules并没有被清理

Bug: GnuTLS recv error (-54): Error in the pull function.

本地几台不同的服务器上有不同的ubuntu虚拟机,执行git clone https://github.com/XXXX的时候,有的可以成功,有的失败报错

fatal: unable to access 'https://github.com/XXXX': GnuTLS recv error (-54): Error in the pull function.

过了一会儿后又可以了,感觉还是网络不稳定导致的,可以等待一会儿
有些解决方法说把https换成git

你可能感兴趣的:(Git使用指南)