Git使用指南
git代码分支操作
git push origin --delete refs/heads/localDev # 删除远程分支
git push --set-upstream origin remotes/origin/localDev # 设置本地关联远程分支
git branch --set-upstream-to=origin/remote_branch local_branch
git branch -m remotes/origin/localDev localDev # 对本地分支进行重命名
git branch -a # 列出所有分支
git push origin :remotes/origin/localDev # 删除远程分支,如果省略本地分支名,则表示删除指定的远程分支,因为这等同于推送一个空的本地分支到远程分支
remote: Powered by xxx.com [GNK-5.0] To xxx.com:username/program.git
[deleted] remotes/origin/localDev xxx@DESKTOP-EOLISFD /mnt/tmp/program
git push origin localDev:Dev # 将本地分支名推送到指定远程分支名
Counting objects: 967, done. Delta compression using up to 4 threads. Compressing objects: 100% (687/687), done. Writing objects: 100% (967/967), 4.84 MiB | 8.31 MiB/s, done. Total 967 (delta 360), reused 710 (delta 263) remote: Resolving deltas: 100% (360/360), completed with 11 local objects. remote: Powered by xxx.com [GNK-5.0] remote: Create a pull request for 'Dev' on Git by visiting: remote: https://xxx.com/username/program/pull/new/username:Dev...username:master To xxx.com:username/program.git
[new branch] localDev -> Dev
git config
给本地分支添加描述信息:
git config branch.{branch_name}.description "描述信息"
描述信息便捷查询工具:git-br
依赖node,npm,安装方式:npm i -g git-br
Git拉取远程分支的代码到本地
# 1. 从远程分支下载对象和引用
git fetch origin remote_branch_name
# 2. 从远程分支获取对象并合并
git pull origin remote_brach_name
git tag 操作
# 远程tag分支
git ls-remote --tags origin
# 列出本地tag
git tags
# 创建
git tag [tag Name]
git tag -a [tag Name] -m desc
# 推送tag到远程仓库
git push origin --tags
# 推送指定本地tag到远程
git push origin [local tag name]
# 删除本地tag
git tag -d [tag name]
# 删除远程tag
git push origin :refs/tags/[remote tag name]
# 拉取远程指定tag
git fetch origin [remote tag name]
# 显示指定tag详细信息
git show [tag name]
Git log
- git reflog: 显示所有关于HEAD的历史
删除reflog条目
git reflog expire --expire=now --all # 不会删除git log记录
git gc
gc: garbage collect 垃圾回收功能
运行 git gc 命令时,git会收集所有松散对象并将它们存入packfile,合并这些packfile进一个大的packfile,然后将不被任何commit引用并且已存在一段时间(数月)的对象删除。还会将所有引用(references)并入一个单独文件。
Git .gitignore
各类编程语言gitignore文件模板:https://github.com/github/gitignore
生效gitignore
gitignore 放置位置在项目的根目录下,而非.git
目录下面,否则不会生效
git rm -r --cached . # 清除缓存
git add .
git commit -m "update .gitignore"
git push origin master
显示项目中被忽略的文件列表
git status --ignored
git clean -ndX
Git不熟悉的操作命令
把对某个文件的修改添加到下次提交中:
git add -p
本地修改
提交之前已标记的变化:
git commit
附加消息提交:
git commit -m "message"
提交,并将提交时间设置为之前的某个时间
git commit --date="date-date='n days ago'" -am "commit message"
修改上次提交信息
请勿修改已发布的提交记录,实际上可以实现修改已发布的记录修改
git commit --amend
Git stash
可以将修改的内容保存到堆栈区,然后再将其恢复出来。
把当前分支未提交的修改,移动到其他分支
git stash
git checkout branch2
也可以创建新的分支,把未提交的修改移动到这个分支上来。
git stash pop
git stash save "save Message"
=>效果等同于 git stash , 多添加了描述信息
git stash list
git stash show
git stash show stash@{$num}
显示第几个存储的改动
git stash show -p
git stash apply
应用于某个存储,但不会把存储从存储列表中删除
git stash pop
恢复之前缓存的目录,对应堆栈会删除
git stash drop stash@{$num}
丢弃对应的存储
git stash clear
删除所有缓存的stash
新增的文件执行 git stash 不会被存储(没有在git版本控制中的文件是不能被stash存储起来的)
这一段不是特别能理解。
常规 git stash 的一个限制是它会一下暂存所有的文件。有时,只备份某些文件更为方便,让另外一些与代码库保持一致。一个非常有用的技巧,用来备份部分文件:
- add 那些你不想备份的文件(例如: git add file1.js, file2.js)
- 调用 git stash –keep-index。只会备份那些没有被add的文件。
- 调用 git reset 取消已经add的文件的备份,继续自己的工作。
https://www.cnblogs.com/zndxall/archive/2018/09/04/9586088.html
-k|--keep-index 表示 stash之后,所有对暂存区的改变会维持不变(比如你之前add 了一个file,提交之后,git status还是能够在暂存区看到你的 add),如果是—no-keep-index的话,stash之后的状态就是git reset —hard HEAD。
作者:xingou 链接:https://www.jianshu.com/p/ea86475cf922 来源:简书 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
搜索
从当前目录的所有文件中查找文本内容
git grep "Hello"
在某一版本中搜索文本
git grep "hello" v2.4
提交历史
显示所有提交信息:(显示hash和message)
git log --oneline
显示某一个用户的所有提交
git log --author="username"
显示某一个文件的所有修改
git log -p <file>
谁,在什么时间,修改了文件的什么内容:
git blame <file>
基于当前分支创建新的分支(不切换到新的分支)
git branch <new-branch-name>
基于远程分支创建新的可追溯的分支:
git branch --track <new_branch> <remote_branch>
分支更新
列出当前配置的远程分支
git remote -v
显示远程分支的信息
git remote show <remote_branch_name>
下载远程端版本,但不合并到HEAD中
git fetch <remote>
下载远程端版本,并自动与HEAD版本合并
git remote pull <remote> <url>
将远程端版本合并到本地版本中
git pull origin master
删除远程端分支
git push <remote> --delete <branch>
合并与重置
将当前HEAD版本重置到分支中
git rebase <branch>
退出重置,回到rebase操作之前的状态,之前的提交不会丢失
git rebase --abort
解决冲突后继续重置
git rebase--continue
git rebase --skip 会将引起冲突的commits丢弃掉,谨慎使用
使用配置好的merge tool解决冲突
git mergetool
在编程器中手动解决冲突后,标记文件为已解决冲突
git add <resolved-file>
git rm <resolved-file>
commit 合并
将多个commit 合并为一个
git rebase -i [StartCommitID] [EndCommitID]
git rebase -i HEAD~n
将最近的n次commit提交合并
然后对每个commit 进行处理:可以除第一个提交保留不变外,其他用fixup或squash进行标记,提交信息是pick标记的信息
pick
: 不做调整,保留提交信息squash
: 合并到上面的 pick中,保留提交信息fixup
:与squash类似,但不保留提交信息
撤销
git status 显示的三种文件状态:
- 修改: modified
- 删除: deleted
- 添加: untracked
取消所有修改,删除
git checkout -f
放弃指定的文件/文件夹的修改,删除
git chekout fileName/Directory
放弃仓库所有添加:
git clean -df
放弃指定文件/文件夹的添加
git clean fileName/Direcory -df
放弃工作目录下的所有修改
git reset --hard HEAD
移除缓存区的所有文件(撤销上次的git add)// 取消暂存区的提交
git reset HEAD
放弃某个文件的所有本地修改
git checkout HEAD <file>
重置一个提交(通过创建一个车截然不同的新提交)
git revert <commit>
将HEAD重置到指定的版本,并抛弃该版本之后的所有修改
git reset --hard <commit-id>
将HEAD重置到上一次提交的版本,并将只会在修改标记为未添加到缓存区的修改:
git reset <commit-id>
将HEAD重置到上一次提交的版本,并保留未提交的本地修改
git reset --keep <commit-id>
git大文件处理
方法一 :git lfs
工具地址:https://git-lfs.github.com/
- 在仓库中执行
git lfs install
- 追踪记录大文件
git lsf track "bigFileName"
- git add && git push
方法二:处理大文件最棘手的问题在于将大文件从commit历史记录中删除。
列出仓库中大文件top10
git rev-list --all | xargs -rL1 git ls-tree -r --long | sort -uk3 | sort -rnk4 | head -10
根据大文件的路径,修改文件的commit历史
git filter-branch --tree-filter "rm -f {filepath}" -- --all
强制提交到远程仓库
git push -f --all
方法三:git-filter-branch的替代品
BFG Repo-Cleaner
使用步骤:
- 安装Java运行环境
bash
sudo apt update
sudo apt install openjdk-11-jdk
# 查看安装结果
java --version
# 回显
openjdk 11.0.11 2021-04-20
OpenJDK Runtime Environment (build 11.0.11+9-Ubuntu-0ubuntu2.18.04)
OpenJDK 64-Bit Server VM (build 11.0.11+9-Ubuntu-0ubuntu2.18.04, mixed mode, sharing)
-
下载bgf-cleaner
-
进入到项目仓库目录下,运行
bash
java -jar bfg.jar -b 100M
如果运行此命令出错: Warning : no large blobs matching criteria found in packfiles - does the repo need to be packed? 则可运行
git gc
后在重复上面的命令 4. 上面命令运行结束以后按照提示运行:bash git reflog expire --expire=now --all && git gc --prune=now --aggressive
- git push
经测试使用,第二种处理大文件的方法比较稳妥。