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 init
和git submodule update
此时进入子仓库目录内,可以发现git版本信息等变成了子仓库的信息
修改子模块后,需要先在子仓库目录内推送至远程,然后再把这个依赖更新信息推送到父仓库
删除submodule时,需要清理几个地方:
- 删除
.gitmodules
中的相关信息 - 删除
.git/modules
中的相关目录 - 删除
.git/config
中的相关引用 - 执行`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