阅读 145

Git 常用命令

0.png

一、代码提交

git clone -b branchName gitAddress  #克隆指定分支
复制代码

1、相同分支名开发提交流程

以下使用ZSH Git alias命令

gst   # 查看文件修改
gaa   # 添加所有修改 index
g cz  # 提交,填写log
gup   # git pull --rebase 合并代码
gaa   # 解决冲突之后,再次添加文件
grbc  # git rebase --continue 继续rebase
gp    # 推送
复制代码
  • glog//查看日志提交

  • glods//查看详细log

2、local分支开发,提交 master分支流程

在 master 分支上开始

git checkout -b local	  # 创建本地dev分支开始开发
git add .               # 添加到工作区
git commit -m "feat(files): detail"  # 或使用commitzen
git checkout master     # 切回master分支
git pull origin master 	# 拉去最新代码
git checkout local      # 切回本地分支local
git rebase master	# local分支合并本地master分支 ,解决冲突
git rebase -i master    # pick squash	//合并多次提交	
git checkout master 
git merge local
git push
复制代码

补充:没有Origin Master分支权限时

git push origin dev
去网站创建PullRequest
复制代码

修改远程上传分支

git branch --set-upstream-to=origin/<branch> 
复制代码

3、关于 rebase / merge

  • 公共分支使用 merge

  • 私有分支使用 rebase

  • merge 建议使用默认 fast-forward

  • 公共分支不允许 push -f

  • pull request 前合并 commit

你应该注意到了“快进(fast-forward)”这个词。 由于你想要合并的分支 hotfix 所指向的提交 C4 是你所在的提交 C2 的直接后继, 因此 Git 会直接将指针向前移动。换句话说,当你试图合并两个分支时, 如果顺着一个分支走下去能够到达另一个分支,那么 Git 在合并两者的时候, 只会简单的将指针向前推进(指针右移),因为这种情况下的合并操作没有需要解决的分歧——这就叫做 “快进(fast-forward)”。

3.1 git merge

git merge [-n] [--stat] [--no-commit] [--squash] [--[no-]edit]
    [-s <strategy>] [-X <strategy-option>] [-S[<keyid>]]
    [--[no-]allow-unrelated-histories]
    [--[no-]rerere-autoupdate] [-m <msg>] [<commit>…?]
git merge --abort
git merge --continue
复制代码

3.2 rebase -i 命令可以压缩合并多次提交

git rebase -i 命令可以压缩合并多次提交
格式:git rebase -i [startpoint] [endpoint]
// 合并从当前head到15f745b(commit id)
git rebase -i 15f745b
//或:
// 合并最近的两次提交
git rebase -i HEAD~2
复制代码

3.3 rebase成功后如何撤销

#首先执行git reflog查看本地记录
git reflog
#回退版本
git reset --hard 9b2d32b605
复制代码

4、git commit

4.1 git commit -m “message” 【gcmsg】

​ 这种是比较常见的用法,-m 参数表示可以直接输入后面的“message”,

4.2 git commit -a -m “massage”【gcam】(不建议使用)

​ 其他功能如-m参数,加的-a参数可以将所有已跟踪文件中的执行修改或删除操作的文件都提交到本地仓库,即使它们没有经过git add添加到暂存区,注意,新加的文件(即没有被git系统管理的文件)是不能被提交到本地仓库的。建议一般不要使用-a参数,正常的提交还是使用git add先将要改动的文件添加到暂存区,再用git commit 提交到本地版本库。

4.3 追加提交 【gcn!】

 git commit --amend --no-edit  #在不增加一个新的commit-id的情况下将新修改的代码追加到前一次
 git push -f  #需要强制推送到远程
复制代码

5、git diff

#1.比较两次commit提交之后的差异:
git diff hash1 hash2 --stat
能够查看出两次提交之后,文件发生的变化。

#2.具体查看两次commit提交之后某文件的差异:
git diff hash1 hash2 -- 文件名

#3.比较两个分支的所有有差异的文件的详细差异:
git diff branch1 branch2

#4.比较两个分支的指定文件的详细差异
git diff branch1 branch2 文件名(带路径)

#5.比较两个分支的所有有差异的文件列表
git diff branch1 branch2 --stat
复制代码

二、放弃代码修改

1、放弃掉还没有加入到缓存区文件

git checkout -- filepathname  #单个文件
git checkout .  #放弃所以的文件修改
复制代码

此命令用来(就是 git add 命令)的修改:内容修改与整个文件删除。但是此命令不会删除掉刚新建的文件。因为刚新建的文件还没已有加入到 git 的管理系统中。所以对于git是未知的。自己手动删除就好了。

2、放弃掉已经加入到缓存区文件

git reset HEAD filepathname  #单个文件
git reset HEAD .             #放弃所以的文件修改
复制代码

3、放弃提交到本地仓库的代码

你可以使用git log 命令来查看git的提交历史。这里可以看到第一行就是 commitid

git reset --hard HEAD         	#来回退到上一次commit的状态。
git reset --hard dfd749b        #此命令可以用来回退到任意版本
git reset --hard origin/master  #放弃本地修改
复制代码

三、常见情况

1、本地有修改,远程有更新,无法pull时

# master分支操作
git fetch origin master
git rebase origin/master
复制代码

2、HEAD detached

#我当前所处的位置是在HEAD detached from bdcfe3d8上
git branch temp bdcfe3d8
git checkout master
git merge temp
git branch -d temp
复制代码

3、分支操作

git branch -a  			  #查看所有分支(gba)
git remote update origin --prune  #若要更新远程分支的本地列表
git push origin --delete ios      #删除远程分支ios
git branch -D ios        	  #删除本地分支ios (gbd ios)
git checkout -b hotfix		  #新建并切换到新分支hotfix(gcb hotfix)
git push origin BranchName        #推送远程新分支
git push -f origin localBranch    #推送本地分支到远程
git branch --set-upstream-to=origin/BranchName   #修改上传地址
git branch -m 原分支名 新分支名      #如果对于分支不是当前分支,可以使用下面代码
git branch -m 新分支名称            #如果是当前,那么可以使用加上新名字
复制代码

4、remte远程地址

git remote set-url origin <url> #修改Origin仓库地址
git remote add origin <url> #添加远程地址的
git remote -v #查看本地添加了哪些远程地址
git remote remove origin #删除本地指定的远程地址
复制代码

5、Another git process seems to be running in this repository

Another git process seems to be running in this repository, e.g. an editor opened by 'git commit'. Please make sure all processes are terminated then try again. If it still fails, a git process may have crashed in this repository earlier: remove the file manually to continue.

解决办法:

rm -f ./.git/index.lock
复制代码

6、修改配置信息

git config --global --list #查看全局配置

#修改分为两种情况:

#1.user.name和user.email的值为空
git config --global user.name "Test"
git config --global user.email "test@qq.com"

#2.user.name和user.email修改
git config --global --replace-all user.name "Test"`
git config --global --replace-all user.email "test@qq.com"
复制代码

7、文件修改详情

git diff [gd]	#比较的是 工作区和暂存区 
git diff --cached [gdca]	#比较的是 暂存区和本地仓库
复制代码

8、忽略文件

8.1 配置.gitignore来忽略我们不想提交到git上的文件

8.2 忽略已经被tracking过的文件

 //(ignoreFile就是你想忽略的文件),让git不再tracking这些文件。 
 git rm -r --cached  ios/Flutter/.last_build_id
 git rm -r --cached  android/gradle/wrapper/gradle-wrapper.properties
复制代码

9、强制拉去服务器代码并进行覆盖本地代码

git fetch --all && git reset --hard origin/master && git pull
复制代码

四、Git Cherry-pick

1、将指定的 commit 应用于当前分支。会产生新的 hash 值。

git cherry-pick <commitHash>     # 合并提交

git cherry-pick feature		 # 上面代码表示将`feature`分支的最近一次提交,转移到当前分支
复制代码

2、转移多个提交

git cherry-pick <HashA> <HashB>	#两个提交

git cherry-pick A..B	 #上面的命令可以转移从 A 到 B 的所有提交。它们必须按照正确的顺序放置:提交 A 必须早于提交 B,否则命令将失败,但不会报错。使用上面的命令,提交 A 将不会包含在 Cherry pick 中。

git cherry-pick A^..B  #如果要包含提交 A
复制代码

3、git cherry-pick命令的常用配置项如下。

(1)-e--edit

打开外部编辑器,编辑提交信息。

(2)-n--no-commit

只更新工作区和暂存区,不产生新的提交。

(3)-x

在提交信息的末尾追加一行(cherry picked from commit ...),方便以后查到这个提交是如何产生的。

(4)-s--signoff

在提交信息的末尾追加一行操作者的签名,表示是谁进行了这个操作。

如果操作过程中发生代码冲突,Cherry pick 会停下来,让用户决定如何继续操作。

(5)--continue

用户解决代码冲突后,第一步将修改的文件重新加入暂存区(git add .),第二步使用下面的命令,让 Cherry pick 过程继续执行。

git cherry-pick --continue
复制代码

(6)--abort

发生代码冲突后,放弃合并,回到操作前的样子。

(7)--quit

发生代码冲突后,退出 Cherry pick,但是不回到操作前的样子。

4、转移到另一个代码库

Cherry pick 也支持转移另一个代码库的提交,方法是先将该库加为远程仓库。

 git remote add target git://gitUrl #添加了一个远程仓库`target`。
 git fetch target		    #将远程代码仓库抓取到本地。
 git log target/master		    #检查一下要从远程仓库转移的提交,获取它的哈希值。
 git cherry-pick <commitHash>	    #使用`git cherry-pick`命令转移提交。
复制代码

五、Log和Tag

1、手动填写Log

格式为 Type(files):detail

Type:

  1. feat: 新功能(feature)
  2. fix: 修补 bug
  3. docs: 文档
  4. style: 样式
  5. refactor: 重构
  6. test: 增加测试
  7. chore: 构建过程或辅助工具的变动

2、安装commitizen

辅助生成 commit msg 规范安装

sudo npm install -g commitizen
sudo npm install -g cz-conventional-changelog
echo '{ "path": "cz-conventional-changelog" }' > ~/.czrc
复制代码

3、打Tag

#在 Git 中列出已有的标签非常简单,只需要输入 git tag (可带上可选的 -l 选项 --list)
git tag
git tag -l "v1.8.5*"  #如果只对 1.8.5 系列感兴趣
git tag -a v1.4 -m "my version 1.4" #附注tag
git tag v1.4-lw     	#轻量tag
git show v1.4					#查看标签信息和与之对应的提交信息
git push origin v1.5  #推送tag
git push origin --tags #批量推送
git tag -d v1.4-lw    #删除本地tag 
git push origin --delete <tagname> #删除远程tags
复制代码

六、找出真凶

#查看某个文件的每一行内容由谁所写
git blame 文件名 -L a,b
#如果只查文件中某一部分由谁所写
git blame 文件名 | grep "查找词"
#有时你想搜索和新增或删除某行代码相关的commit
git log -S"Hello,World!"
#如果你想使用正则表达式去匹配而不是字符串, 那么你可以使用-G代替-S.
git log -G
复制代码
文章分类
开发工具
文章标签