git 命令大全

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 protected]"

配置别名

git config --global alias.st status
git config --global alias.lg ' log --graph --pretty=oneline --abbrev-commit'

配置秘钥

在用户主目录里找到.ssh目录,里面有id_rsaid_rsa.pub两个文件,这两个就是SSH Key的秘钥对,id_rsa是私钥,不能泄露出去,id_rsa.pub是公钥,可以放心地告诉任何人。

ssh-keygen -t rsa -C "[email protected]"

然后把公钥添加到远程仓库的配置里可以了,settings --> SSH AND GPG KEYS --> SSH KEYS

下载代码 两种方式

  1. 使用 https
git clone https://github.com/stayhungrygogogo/Sosuke-study
  1. 使用 ssh
git clone [email protected]: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 ..." to update what will be committed)
  (use "git checkout -- ..." to discard changes in working directory)

        deleted:    test.txt

Untracked files:
  (use "git add ..." 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  [email protected]:stayhungrygogogo/Sosuke-study.git (fetch)
origin  [email protected]:stayhungrygogogo/Sosuke-study.git (push)

添加远程服务器配置

git remote add origin [email protected]:stayhungrygogogo/Sosuke-study.git

推送修改并且管理仓库

git push -u origin master

由于远程库是空的,我们第一次推送master分支时,加上了-u参数,Git不但会把本地的master分支内容推送的远程新的master分支,还会把本地的master分支和远程的master分支关联起来,在以后的推送或者拉取时就可以简化命令。

删除远程仓库配置

git remote rm 

拉取最新的代码

保证代码是最新的,避免覆盖别人的代码。一般是在add变更文件之前或者commit之后,push之前进行此操作。

git pull 

合并代码,解决冲突

从远程拉去代码的时候,如果本地有修改,会产生冲突,会打印出来有冲突的文件,找到对应的文件,处理完冲突之后,再次进行add/commit,然后把变更提交到远程。

查看修改了什么内容

在修改文件之后,添加文件之前,可以查看变更信息

git diff test.txt

查看修改日志

git log

日志输出太多怎么办,可以添加--pretty=oneline

git log --pretty=oneline

代码回滚(reset)

可以通过reset -hard 命令进行回退

  1. 回退到特定版本,根据版本uuid的前几位字符进行回滚

  2. 通过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 [email protected]: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 <[email protected]>
| Date:   Sun May 22 11:17:11 2022 +0800
| 
|     git branch dev comit
| 
* commit 68ea0ab6c22df8474b6854465f71be49260db148 (origin/master, origin/HEAD)
| Author: Sosuke <[email protected]>
| 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 ", 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'

在线生成.gitignore配置

大佬分享的多种语言的.gitignore配置

推荐链接:廖雪峰--git教程

林胖胖哒注释教程

你可能感兴趣的:(git 命令大全)