GIT使用教程
安装git
mac版本安装,一行命令搞定
brew install git
查看git版本
git --version
git version 2.20.1
配置相关
配置用户信息
git config --global user.name "Your Name"
git config --global user.email "email@example.com"
配置别名
git config --global alias.st status
git config --global alias.lg ' log --graph --pretty=oneline --abbrev-commit'
配置秘钥
在用户主目录里找到
.ssh
目录,里面有id_rsa
和id_rsa.pub
两个文件,这两个就是SSH Key的秘钥对,id_rsa
是私钥,不能泄露出去,id_rsa.pub
是公钥,可以放心地告诉任何人。
ssh-keygen -t rsa -C "youremail@example.com"
然后把公钥添加到远程仓库的配置里可以了,settings --> SSH AND GPG KEYS --> SSH KEYS
下载代码 两种方式
- 使用 https
git clone https://github.com/stayhungrygogogo/Sosuke-study
- 使用 ssh
git clone git@github.com:stayhungrygogogo/Sosuke-study.git
自己初始化仓库
git init
添加文件
git add test.txt
提交修改
单纯提交代码
git commit -m ''
提交新增文件
git commit -ad ''
删除文件
如果删除了文件
git status
On branch master
Changes not staged for commit:
(use "git add/rm <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
deleted: test.txt
Untracked files:
(use "git add <file>..." to include in what will be committed)
应为 git 是针对内容的变更,所有使用 add/rm ,都可以把工作区的删除更新到缓存区
git add/rm test.txt
查看本地仓库的状态
git status
提交代码到服务器
git push origin master
查看远程服务器
>git remote -v
origin git@github.com:stayhungrygogogo/Sosuke-study.git (fetch)
origin git@github.com:stayhungrygogogo/Sosuke-study.git (push)
添加远程服务器配置
git remote add origin git@github.com:stayhungrygogogo/Sosuke-study.git
推送修改并且管理仓库
git push -u origin master
由于远程库是空的,我们第一次推送master
分支时,加上了-u
参数,Git不但会把本地的master
分支内容推送的远程新的master
分支,还会把本地的master
分支和远程的master
分支关联起来,在以后的推送或者拉取时就可以简化命令。
删除远程仓库配置
git remote rm <name>
拉取最新的代码
保证代码是最新的,避免覆盖别人的代码。一般是在add变更文件之前或者commit之后,push之前进行此操作。
git pull
合并代码,解决冲突
从远程拉去代码的时候,如果本地有修改,会产生冲突,会打印出来有冲突的文件,找到对应的文件,处理完冲突之后,再次进行add/commit
,然后把变更提交到远程。
查看修改了什么内容
在修改文件之后,添加文件之前,可以查看变更信息
git diff test.txt
查看修改日志
git log
日志输出太多怎么办,可以添加--pretty=oneline
git log --pretty=oneline
代码回滚(reset)
可以通过
reset -hard
命令进行回退
回退到特定版本,根据版本uuid的前几位字符进行回滚
通过HEAD^,回退到上一个版本,两个
^^
就是回退两个版本,多个版本,可以使用HEAD-10
,回退十个版本。
git reset --hard HEAD^
git reset --hard 68ea0ab
- 回退缓存区的版本
git reset HEAD file
代码回滚(checkout --)
如果没有添加修改到缓存区,回退之后,就是上次commit或者add时候的状态,放弃工作区中所有的修改。(也可以手动删除)
git checkout -- file
如果已经把内容提交到了本地分支,也可以使用reset
回退版本,然后在清空工作区。
查找执行过的命令日志
git reflog
68ea0ab (HEAD -> master) HEAD@{0}: reset: moving to 68ea0ab
cc950a8 (origin/master, origin/HEAD) HEAD@{1}: reset: moving to HEAD^
68ea0ab (HEAD -> master) HEAD@{2}: commit: git diff
cc950a8 (origin/master, origin/HEAD) HEAD@{3}: commit (merge): megre 11
c41723a HEAD@{4}: commit: megre
d546023 HEAD@{5}: commit: modified
3e8b7db HEAD@{6}: clone: from git@github.com:stayhungrygogogo/Sosuke-study.git
缓存区(staged)
staged是git的一个缓存区的概念,
git add/rm file
命令就是把文件放入本地分支的缓存区。
Changes not staged for commit://标识修改过还未添加到缓存区的文件
Untracked files://显示所有从未添加到缓存区的文件
分支管理
创建分支
git branch dev
切换分支
以前版本是使用checkout
git checkout dev
最新的git版本也提供了新的命令switch
,我的版本是git version 2.20.1,目前是不支持的
git switch dev
创建并切换分支
两种方式
git checkout -b dev
git switch -c dev
查看当前所在分支
git branch
合并代码到主分支
切换回主分支
git checkout master
然后使用以下命令执行合并分支
git merge dev
删除分支
代码合并没有问题的情况下,可以删除分支代码
git branch -d dev
合并分支冲突解决
当分支dev
往主线master
合并代码的时候,可能会出现冲突,就是主线master
和分支dev
修改了同一个文件,并且都提交了。合并的时候就会出现冲突。有冲突的文件,需要处理冲突以后,再次add
commit
,才算合并完成。
分支合并图
git log --graph
* commit 40d9c9d7bb6859e42782c033ae788052bb3342ac (HEAD -> master, dev)
| Author: Sosuke <601599875@qq.com>
| Date: Sun May 22 11:17:11 2022 +0800
|
| git branch dev comit
|
* commit 68ea0ab6c22df8474b6854465f71be49260db148 (origin/master, origin/HEAD)
| Author: Sosuke <601599875@qq.com>
| Date: Sat May 21 22:09:04 2022 +0800
git log --graph --pretty=oneline
* 40d9c9d7bb6859e42782c033ae788052bb3342ac (HEAD -> master, dev) git branch dev comit
* 68ea0ab6c22df8474b6854465f71be49260db148 (origin/master, origin/HEAD) git diff
* cc950a8a6ae01d8419b210cceb56279c3b990d4b megre 11
|\
| * 69a440d70d2c10cd3088995f8e7e4daf6e27243e test megre
* | c41723a121226666c2e9efb708ae1c4fa74f4e6a megre
|/
* d546023eea76dc7420b79f62805b9366c029fbff modified
* 3e8b7db851d7f3147b7271017ee86ea4ea2581ee rm -4
git log --graph --pretty=oneline --abbrev-commit
* 40d9c9d (HEAD -> master, dev) git branch dev comit
* 68ea0ab (origin/master, origin/HEAD) git diff
* cc950a8 megre 11
|\
| * 69a440d test megre
* | c41723a megre
|/
* d546023 modified
* 3e8b7db rm -4
Git分支策略模式
Fast Forward
git 默认使用,快速合并,只是单纯的把代码合并到主线,在提交记录体现不出来。
git merge dev
git log --graph --pretty=oneline --abbrev-commit
* | 04d4428 master update Readme.md
|\ \ //体现不出来合并情况
| |/
| * 5c40807 dev test f2
| * f88268f dev test fast-forward
* | 034fef3 update master-fast-forward.md
* | 6bb7266 add file
* | c1a27af master dev update branchDev.md
|\ \
| |/
| * 46bce0f dev update branchDev.md
* | 535fa6e master update branchDev.md
|/
* 40d9c9d git branch dev comit
no fast forward
使用这种模式提交的代码,在合并的过程中,可以体现出一条合并记录。
git merge --no-ff -m '--no-ff merge master dev' dev
git log --graph --pretty=oneline --abbrev-commit
* c3806e7 (HEAD -> master) master update --no-ff.md
* 176f880 --no-ff merge master dev // 合并的时候,有提交记录的体现
|\
| * 81a6266 (dev) dev udpate no-ff.md
| * de1abd4 dev add no-ff.md
* | 04d4428 master update Readme.md
|\ \
| |/
| * 5c40807 dev test f2
| * f88268f dev test fast-forward
* | 034fef3 update master-fast-forward.md
* | 6bb7266 add file
* | c1a27af master dev update branchDev.md
|\ \
stash(存储分支)
如果正在开发一个功能, 还没有完成,然后发现了一个线上的紧急bug,需要修复,那么可以先把当前分支修改的内容存储起来,然后新建一个修改bug 的分支,等bug修改完,提交之后,在恢复当前分支,继续工作。
stash: 藏匿; 隐藏; 存放; 贮藏
一个大概的流程
- 存储当前分支,如果有多个分支在调整,需要多次处理
- 切换到主线分支,
git checkout master
- 创建一个新的bug分支,并切换到该分支,
git checkout -b bug-007
- 修改完bug之后,提交到缓存区
git add/commit
,然后合并代码到主线,并且push
到远程 - 恢复工作现场,并且删除储存的工作区内容(视情况而定),继续自己的工作
在正在执行修改代码的分支执行一下命令,然后你就会发现自己修改的内容,都被恢复到修改前的状态,然后新增的文件都看不到了。
git stash
Saved working directory and index state WIP on dev: 81a6266 dev udpate no-ff.md
因为分支工作区可能有多个,可以查看存储的分支现场列表
git stash list
stash@{0}: WIP on dev: 81a6266 dev udpate no-ff.md
stash@{1}: WIP on dev: 81a6266 dev udpate no-ff.md
恢复分支工作现场,但是这样回复,是不会删除之前存储的工作区。
git checkout dev // 切换到对应分支
git stash apply //恢复工作现场
使用以下命令,恢复并删除一个存储的工作区
git checkout dev // 切换到对应分支
git stash pop //恢复工作现场
因为存在多个存储的dev分支工作区,pop
名字,类似栈的操作,优先恢复到最后一次添加存储的现场
git stash pop
git stash list
stash@{0}: WIP on dev: 81a6266 dev udpate no-ff.md
也可以恢复到指定的存储的现场
git stash pop stash@{0}
主线修改的bug同步到分支
git checkout dev //首先切换到对应的对应的分支
git cherry-pick 5947281 // 5947281为主线修复bug的版本
强制删除分支
如果项目需要新加一个功能,最好新建一个feature/dev分支,后续如果功能废弃,不需要合并到主线,又需要删除分支,普通的删除分支命令会有异常,需要强制删除。
git branch -d bug007
error: The branch 'bug007' is not fully merged.
If you are sure you want to delete it, run 'git branch -D bug007'.
使用以下命令强制删除
git branch -D bug007
推送本地分支到远程
使用一下命令,直接就可以把dev
分支推送到远程
git push origin dev
拉去远程分支到本地分支
git clone git@XXX
git checkout -b dev-remote origin/dev //前提是远程有dev分支
关联本地分支和远程分支
如果推送push
的提示有冲突,pull
的时候,提示There is no tracking information for the current branch.
,使用下列命令进行关联.
git branch --set-upstream-to=origin/dev dev
分支 'dev' 设置为跟踪来自 'origin' 的远程分支 'dev'。
git branch -u origin/dev dev1 //使用这个命令一样的效果
变基(rebase)
提交失败,有冲突,解决过冲突之后,日志看着特别的乱
git log --graph --pretty=oneline --abbrev-commit
* 9f3c56d (HEAD -> dev1) merge come on!
|\
| * d5ec02c (origin/dev, dev) 添加了stash.md文件
| * 7d2f899 修复了bug007
| * 945dcf2 master update --no-ff.md
| * 81a6266 dev udpate no-ff.md
| * de1abd4 dev add no-ff.md
| * 5c40807 dev test f2
| * f88268f dev test fast-forward
| * 46bce0f dev update branchDev.md
| * 40d9c9d git branch dev comit
| * 68ea0ab git diff
| * cc950a8 megre 11
| |\
| * | c41723a megre
* | | 954e539 come on!
| |/
|/|
* | 69a440d (master) test megre
|/
* d546023 modified
* 3e8b7db rm -4
进行变基操作
rebase
首先,回退头指针以便在其上重放您的工作...
应用:come on!
使用索引来重建一个(三方合并的)基础目录树...
M README.md
回落到基础版本上打补丁及进行三方合并...
自动合并 README.md
冲突(内容):合并冲突于 README.md
error: 无法合并变更。
打补丁失败于 0001 come on!
提示:用 'git am --show-current-patch' 命令查看失败的补丁
Resolve all conflicts manually, mark them as resolved with
"git add/rm <conflicted_files>", then run "git rebase --continue".
You can instead skip this commit: run "git rebase --skip".
To abort and get back to the state before "git rebase", run "git rebase --abort".
git log --graph --pretty=oneline --abbrev-commit
* d5ec02c (HEAD, origin/dev, dev) 添加了stash.md文件
* 7d2f899 修复了bug007
* 945dcf2 master update --no-ff.md
* 81a6266 dev udpate no-ff.md
* de1abd4 dev add no-ff.md
* 5c40807 dev test f2
* f88268f dev test fast-forward
* 46bce0f dev update branchDev.md
* 40d9c9d git branch dev comit
* 68ea0ab git diff
* cc950a8 megre 11
==变基过程中,出现了异常没有解决最终跳过了变基==
相关命令:
git rebase --continue/skip/abort // 继续/跳过//终止 每整太明白
标签管理
创建标签
对当前版本打标签
git tag v1.0
对历史版本打标签
git tag v0.9 f52c633
带说明的标签
git tag -a v0.6 -m 'linus si niubi'
查看标签
查看所有的标签
git tag
查看指定标签的变更
git show v0.8
删除标签
git tag -d v0.8
推送标签到远程
git push origin v1.0
删除远程标签
先删除本地标签,在推送删除状态到远程
git tag -d v0.8
git push origin :refs/tags/v0.8
忽略功能(.gitignore)
在提交代码的时候,有一部分代码不想提交,则可以通过配置忽略文件的方式来解决。
注释
和很多配置文件的注释一样,使用#
# 这是一行注释
文件
忽略以某个后缀结尾的文件
*.class
在忽略范围内,反向忽略的文件,叫反忽略,哈哈哈
!HelloWord.class # 在忽略的 class 文件中,不忽略该文件
忽略指定字符开头的指定长度后缀的文件
*.cla?? # 忽略长度为 5 ,切后缀以 cla 开头的文件
文件夹
/
代表一个文件夹
/demoFile # 忽略某一个文件夹下的 demoFile
忽略一个文件夹下的所有文件
demo/ # 忽略 demo 文件夹下的所有文件
反向操作文件夹
!demo/ # 某一个文件夹不被忽略,如果同名文件配置了忽略,文件夹会受影响
忽略指定文件夹下的指定格式文件
demo/*.DS_Store # 忽略该文件下的所有 .DS_Store 后缀的文件
多层嵌套目录,**
demo/**/target/ $ demo 文件夹下的所有target文件夹
.gitignore规则不生效的解决办法
把某些目录或文件加入忽略规则,按照上述方法定义后发现并未生效,原因是 .gitignore 只能忽略那些原来没有被追踪的文件,如果某些文件已经被纳入了版本管理中,则修改 .gitignore 是无效的。那么解决方法就是先把本地缓存删除(改变成未被追踪状态),然后再提交.
git rm -r --cached .
git add .
git commit -m 'update .gitignore'
推荐链接:廖雪峰--git教程