git命令收集
Git 命令行提交代码详细操作
史上最详细Git使用教程
Git命令大全
分支管理概念
创建合并删除
一开始的时候,master分支是一条线,Git用master指向最新的提交,再用HEAD指向master,就能确定当前分支,以及当前分支的提交点:
每次提交,master分支都会向前移动一步,这样,随着你不断提交,master分支的线也越来越长。
当我们创建新的分支,例如dev时,Git新建了一个指针叫dev,指向master相同的提交,再把HEAD指向dev,就表示当前分支在dev上:
Git创建一个分支很快,因为除了增加一个dev指针,改改HEAD的指向,工作区的文件都没有任何变化!
不过,从现在开始,对工作区的修改和提交就是针对dev分支了,比如新提交一次后,dev指针往前移动一步,而master指针不变:
假如我们在dev上的工作完成了,就可以把dev合并到master上。Git怎么合并呢?最简单的方法,就是直接把master指向dev的当前提交,就完成了合并【这里只是一种最简单的情况】:
所以Git合并分支也很快!就改改指针,工作区内容也不变!
合并完分支后,甚至可以删除dev分支。删除dev分支就是把dev指针给删掉,删掉后,我们就剩下了一条master分支:
解决冲突
当先后在 以master为源创建的的feature1分支 和 master分支中,修改了同一个文件的同一行。此时这两个分支分别有了新的提交,如下图所示:
这种情况下无法进行快速合并,只能试图把各自的修改合并起来,这样有可能会造成冲突:
$ git merge feature1
Auto-merging test.txt
CONFLICT (content): Merge conflict in test.txt
Automatic merge failed; fix conflicts and then commit the result.
接下来需要实用git status
查看冲突文件,之后修改这个冲突文件,修改之后在add commit。现在,master分支和feature1分支变成了下图所示:
用git log --graph --pretty=oneline --abbrev-commit
可以看到分支的合并情况,包括分支合并图(–graph)、一行显示(–pretty=oneline)、提交校验码缩略(–abbrev-commit)显示:
$ git log --graph --pretty=oneline --abbrev-commit
* cf810e4 (HEAD -> master) conflict fixed
|\
| * 14096d0 (feature1) AND simple
* | 5dc6824 & simple
|/
* b17d20e branch test
* d46f35e (origin/master) remove test.txt
* b84166e add test.txt
* 519219b git tracks changes
* e43a48b understand how stage works
* 1094adb append ABC
* eaadf4e a new file
分支管理策略
通常,合并分支时,Git会用快速合并模式(Fast forward),但这种模式下,删除分支后,会丢掉分支信息。一般使用如下的普通合并模式,在删除分支后还能保留分支信息:
$ git merge --no-ff -m "merge with no-ff" dev
分支策略
master分支是最稳定的,只能用于发布新版本,平时不能在上面进行开发,要在新建的分支上进行开发,比如dev,这时dev是不稳定的,到产品1.0发布时,将dev分支和master分支合并,在master分支上发布1.0版本。
所以团队合作的分支看起来就像这张图一样:
bug分支
场景:手头有正在进行的未完成修改工作。修复bug时,我们会创建一个bug分支进行修复,修复完合并,删除分支。
#保存add之后的工作现场
$ git stash
Saved working directory and index state WIP on dev: f52c633 add merge
#查看下工作区是否干净
$ git status
#等bug修复完分支删除后,我们先查看下stash
$ git stash list
stash@{0}: WIP on dev: f52c633 add merge
#用git stash apply恢复,但是恢复后,stash内容并不删除,你需要用git stash drop来删除
$ git stash apply stash@{0}
#用git stash pop,恢复的同时把stash内容也删了
$ git stash pop
基本配置
Git 一共有3个配置文件:
- 仓库级的配置文件:在仓库的 .git/.gitconfig,该配置文件只对所在的仓库有效。
- 全局配置文件:Mac 系统在 ~/.gitconfig,Windows 系统在 C:\Users<用户名>.gitconfig。
- 系统级的配置文件:在 Git 的安装目录下(Mac 系统下安装目录在 /usr/local/git)的 etc 文件夹中的 gitconfig。
# 查看当前生效的配置信息
$ git config -l
# 配置提交用户信息,--global代表全局
$ git config --global user.name <用户名>
$ git config --global user.email <邮箱地址>
# 根据不同的项目绑定不同的用户名和邮箱:进入项目根目录(去掉–global即可):
```shell
git config user.name “Your_userName”
git config user.email “Your_userEmail”
# 更改Git缓存区的大小
# 缓存大小单位:B,例如:524288000(500MB)
$ git config --global http.postBuffer <缓存大小>
# 配置可以缓存密码,默认缓存时间15分钟
# 缓存时间单位:秒
$ git config --global credential.helper 'cache --timeout=<缓存时间>'
# 配置长期存储密码
$ git config --global credential.helper store
常用命令
- 查看历史命令
git reflog
- 克隆现有的仓库,若没有自定义本地仓库名称,则默认远程仓库名称
git clone 远程仓库URL (本地仓库自定义名称)
- 查看仓库所有分支
git branch -a
- 新建分支并切换至新分支
git checkout -b 分支名
- 推送本地分支到远程分支(远程分支与本地分支同名)
git push origin 分支名:分支名
# 首次推送,推送远程分支并绑定远程分支
git push -u origin 分支名
- 让本地分支与远程分支建立关联
git branch --set-upstream-to=origin/分支名
git branch -u origin/分支名
注:如第五步操作未执行,拉取远程代码需执行:git pull origin 分支名,需标明拉取远程的具体分支名。
- 切换至其他分支
git checkout 分支名
- 删除分支:先切换到非删除的分支,同个分支一般先删除远程分支再删除本地分支
7.1. 删除远程分支
git push origin --delete 分支名
7.2. 删除本地分支
git branch -d XX :普通删除分支
git branch -D XX :强制删除分支
- 查看本地仓库当前代码状态
git status
- 添加要提交的代码文件
git add . : 添加所有文件
git add file1 file2 file3 : 自定义添加多个文件,文件间实用空格隔开
git add -u [<文件路径>] : 添加所有修改、已删除的文件到暂存区中,不包含新增文件
- 提交到本地仓库
git commit -m “描述语句”
- 执行第10点后,要执行一下
git pull
,合并分支最新代码,查看是否会冲突,若会冲突
11.1 点进冲突文件进行修改冲突的代码然后再重新执行第11点;
11.2 回滚代码:
(1). git stash //这是将本地代码回滚至上一次提交的时候,就是没有自己新改的代码;
(2). git pull origin分支名 //将远程的代码拉下来,“origin分支名”一般可以省略;
(3). git stash pop //将上面git stash回滚的代码释放出来,相当于将自己修改的代码与下拉的代码合并;
(4). 重新从第11点开始执行;
- push到远程仓库
git push
- 合并分支代码:如main分支合并至dev分支,则先切换至dev分支
git merge main //表示将main分支合并至dev分支
13.1 合并分支出现冲突
修改冲突文件代码,然后按需保留即可,然后 add commit pull push
标签管理
# 打印所有的标签
$ git tag
# 添加轻量标签,指向提交对象的引用,可以指定之前的提交记录
$ git tag <标签名称> [<commit ID>]
# 添加带有描述信息的附注标签,可以指定之前的提交记录
$ git tag -a <标签名称> -m <标签描述信息> [<commit ID>]
# 切换到指定的标签
$ git checkout <标签名称>
# 查看标签的信息
$ git show <标签名称>
# 删除指定的标签
$ git tag -d <标签名称>
# 将指定的标签提交到远程仓库
$ git push <远程仓库的别名> <标签名称>
# 将本地所有的标签全部提交到远程仓库
$ git push <远程仓库的别名> –tags
一些方法记录
新建本地仓库并发布到远程仓库
git init -- 新建一个本地仓库
git add README.md -- 将README.md文件加入到仓库中
git commit -m "first commit" -- 将文件commit到本地仓库
git remote add origin https://github.com/XuDaojie/Lee.git -- 远程添加新仓库,origin只是一个远1程仓库的别名,可以随意取
git push -u origin master -- 将本地仓库push远程仓库,并将origin设为默认远程仓库,也就是master h绑定远程仓库
本地打标签并推送到远程
不在远程新建分支
git checkout -b test_tag --新建分支
git tag logcoworkerdaasnj -- 本地打标签
git push origin logcoworkerdaasnj -- 推送本地标签到远程
带有子模块的git常用命令
git clone <repository> --recursive //递归的方式克隆整个项目
git submodule add <repository> <path> //添加子模块
git submodule init //初始化子模块
git submodule update //更新子模块
git submodule foreach git pull //拉取所有子模块
git 子模块的操作
添加子模块非常简单,命令如下:
git submodule add <url> <path>
其中,url
为子模块的路径,path
为该子模块存储的目录路径。
执行成功后,git status
会看到项目中修改了.gitmodules
,并增加了一个新文件(为刚刚添加的路径)
git diff --cached
查看修改内容可以看到增加了子模块,并且新文件下为子模块的提交hash摘要
git commit
提交即完成子模块的添加
子模块的使用
git submodule init
git submodule update
或者
git submodule update --init --recursive
执行后,子模块目录下就有了源码,再执行相应的makefile即可
子模块的更新
git rebase合并多次commit
将多次commit合并,只保留一次提交历史记录
git log
查看提交历史git rebase -i HEAD~6
orgit rebase -i hasdid
pick
修改为squash
或者fixup
, 后者是忽略本次提交的log- git 会压缩提交历史,若有冲突,需要进行修改,修改的时候保留最新的历史记录,修复冲突之后执行
git add .
和git rebase --continue
如果想要放弃本次压缩,使用命令git rebase --abort
- 若无冲突 or 冲突已 fix,则会出现一个
commit message
编辑页面,修改commit message
,然后 输入:wq
orx
保存退出。 - 提交
git push -f
orgit push --force
- 查看远程仓库,之前多次提交的
commit
已经被合并成一次commit
已删除远程分支但本地还能看到远程分支
git remote prune origin
按照远程仓库裁剪本地记录
撤销本地所有修改回退历史版本
git checkout .
//未add
git checkout -- filepathname
//未add,撤销指定文件修改,新建文件需要自己手动删除
git reset HEAD filepathname
//已add,撤销指定文件,回到未add状态
git reset HEAD .
//已add,撤销本地所有文件的修改,回到未add状态
git reset --hard HEAD^
//已commit,回退到上一次commit的状态,HEAD^n会退上个版本
git reset --hard commitid
//已commit,回退到任意版本
git 新建本地分支,并对应建立远程分支和推送到远程分支
git clone http://gitlab.xxxxx.com/xxxxx/xxxxx.git
cd xxxxx/
git log
//找到对应版本的SHA值 例如2b1c225dcbbc4e1da11164af945344d88bc8f559
git checkout -b 新分支名 2b1c225dcbbc4e1da11164af945344d88bc8f559
//不会和远程分支建立映射关系
git fetch origin 远程分支名x:本地分支名x
//不会和远程分支建立映射关系
git branch
//查看分支是否创建成功
git push origin 本地新分支名:远程新分支名
//不存在会创建分支,推送本地cod到远程分支仓库
git branch -u origin/远程新分支名
//和远程新分支名建立映射关系
git branch --unset-upstream
//撤销本地分支与远程分支的映射关系
git branch -vv
//查看本地分支和远程分支映射关系