leelongcrazy's blog

Git使用指南2

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 的一个限制是它会一下暂存所有的文件。有时,只备份某些文件更为方便,让另外一些与代码库保持一致。一个非常有用的技巧,用来备份部分文件:

  1. add 那些你不想备份的文件(例如: git add file1.js, file2.js)
  2. 调用 git stash –keep-index。只会备份那些没有被add的文件。
  3. 调用 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 合并为一个

  1. git rebase -i [StartCommitID] [EndCommitID]
  2. 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/

  1. 在仓库中执行git lfs install
  2. 追踪记录大文件 git lsf track "bigFileName"
  3. 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

使用步骤:

  1. 安装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)

  1. 下载bgf-cleaner

  2. 进入到项目仓库目录下,运行

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

  1. git push

经测试使用,第二种处理大文件的方法比较稳妥。

IT Tech, Git