万字干货,git常用命令用法知识总结
Posted MmM豆
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了万字干货,git常用命令用法知识总结相关的知识,希望对你有一定的参考价值。
文章目录
安装
这个百度安装就行了,
更新
git update(已经被弃用,也能使用,忘记新命令时,输入会提示你最新命令)
windows(最新更新命令)
`git update-git-for-windows
mac (没有用mac,大家自己用git update试试)
tips
2.14.1及之前版本的git 并没有update这两个命令,也可以去官方下载覆盖即可
安装完成后 git version查看版本
一、分支
首先需要理清楚,分支这个概念, 一般至少会有2个分支,master,主分支,用于线上正在使用的分支,和dev开发中的分支,所以我们第一次创建git线上仓库的时候,就要创建2个分支代码相同,master 和dev。
第二个概念,本地分支,和远程分支的区别,首先清楚,本地分支和远程分支是不同的,当我们第一次git代码下来后,
到拉去的文件下面右键 git bash here
这时可以看见这个有个master, 但是注意,这个指的是本地分支,本地如何修改,只要不推送到线上,都不会影响,线上代码,可以理解为,本地git仓库,和线上git仓库
基于上面的图,我们就有接下来一些概念
- 版本库
.git
- 当我们使用git管理文件时,比如
git init
时,这个时候,会多一个.git
文件,我们把这个文件称之为版本库。 .git文件
另外一个作用就是它在创建的时候,会自动创建master分支,并且将HEAD指针指向master分支。
- 当我们使用git管理文件时,比如
- 工作区
- 本地项目存放文件的位置
- 可以理解成图上的workspace
- 暂存区 (Index/Stage)
- 顾名思义就是暂时存放文件的地方,通过是通过add命令将工作区的文件添加到缓冲区
- 本地仓库(Repository)
- 通常情况下,我们使用commit命令可以将暂存区的文件添加到本地仓库
- 通常而言,HEAD指针指向的就是master分支
- 远程仓库(Remote)
- 举个例子,当我们使用GitHub托管我们项目时,它就是一个远程仓库。
- 通常我们使用clone命令将远程仓库代码拷贝下来,本地代码更新后,通过push托送给远程仓库。
二、常用命令
当我们第一次git后,如果你是拉取的master,第一件事,是创建 本地dev分支,关联线上dev分支
初始化git
git init
(一)、分支
查询本地分支
git branch
查看远程分支
git branch -r
查看所有分支(本地+远程)
git branch -a
切换本地分支
git checkout <branch-name>
删除本地分支
git branch -d <branch-name>
当前分支与指定分支合并
git merge <branch-name>
合并分支多个commit记录
git rebase -i [startpoint] [endpoint]
其中-i的意思是–interactive,即弹出交互式的界面让用户编辑完成合并操作,[startpoint] [endpoint]则指定了一个编辑区间,如果不指定[endpoint],则该区间的终点默认是当前分支HEAD所指向的commit(注:该区间指定的是一个前开后闭的区间)。如果都不指定默认合并全部
通过git rebase -i 将本地的多次提交合并为一个,以简化提交历史。本地有多个提交时,如果不进行这一步,在git rebase master时会多次解决冲突(最坏情况下,每一个提交都会相应解决一个冲突)
示例
假设3条提交
c784dc6 HEAD@1: commit:3
1e35170 HEAD@2: commit: 2
45d0527 HEAD@3: reset: 1
合并3条提交
git rebase -i 45d0527 c784dc6
或者
git rebase -i HEAD~3 表示合并2条
重命名分支
git branch -m <oldbranch-name> <newbranch-name>
- 拉取远程分支并创建本地分支
git checkout -b 本地分支名 origin/远程分支名
//相当于创建一个新的分支,并且关联上远程的分支
// 另外一种方式,也可以完成这个操作。
git fetch origin <branch-name>:<local-branch-name>
强制关联上游分支并提交到远程仓库
fatal: The current branch dev has no upstream branch.
To push the current branch and set the remote as upstream, use
git push --set-upstream origin dev
有时候提交会报错,提示你没有关联上级分支
git push --set-upstream origin dev
关联远程分支
有时候会pull会提示
$ git pull
There is no tracking information for the current branch.
Please specify which branch you want to merge with.
See git-pull(1) for details.
git pull <remote> <branch>
If you wish to set tracking information for this branch you can do so with:
git branch --set-upstream-to=origin/<branch> master
git branch --set-upstream-to=origin/分支名称
创建本地分支提交并创建远程分支
git checkout -b dev
git push origin dev
(二) 撤销
git reset --(soft | mixed | hard ) < HEAD ~(num) >
指令 | 作用范围 |
---|---|
–hard | 删除工作空间改动代码,撤销commit,撤销git add . 注意完成这个操作后,就恢复到了上一次的commit状态。 |
–mixed | 意思是:不删除工作空间改动代码,撤销commit,并且撤销git add . 操作 这个为默认参数,git reset --mixed HEAD^ 和 git reset HEAD^ 效果是一样的。 |
–soft | 不删除工作空间改动代码,撤销commit,不撤销git add . |
撤销add 工作区
git reset HEAD 表示撤销上次add的所有文件
git reset HEAD dir/dir/test.php 撤销指定文件
撤销commit 暂存区
git reset --soft HEAD^ 撤销了你上次的commit(仅仅是撤回commit操作,代码仍然保留)
HEAD^的意思是上一个版本,也可以写成HEAD~1
如果你进行了2次commit,想都撤回,可以使用HEAD~2
如果commit注释写错了,只是想改一下注释,只需要:
git commit --amend //此时会进入默认vim编辑器,修改注释完毕后保存就好了。
版本回退
$ git reset --hard HEAD^ 回退到上个版本
$ git reset --hard HEAD~3 回退到前3次提交之前,以此类推,回退到n次提交之前
$ git reset --hard commit_id 退到/进到 指定commit的sha码
回退到指定的commit
查看操作日志
git reflog
最前面的黄色字体就是操作的id,就能通过他回退到指定到的位置
例如
git reset --hard 45d0527
查看文件状态
git status
三、配置默认账号密码
首先,如果我们git clone的下载代码的时候是连接的https://而不是git@git (ssh)的形式,当我们操作git pull/push到远程的时候,
总是提示我们输入账号和密码才能操作成功,频繁的输入账号和密码会很麻烦,也特别烦恼。
解决办法:
git bash进入你的项目目录,输入:
git config --global credential.helper store
然后你会在你本地生成一个文本,上边记录你的账号和密码。当然这些你可以不用关心。
然后你使用上述的命令配置好之后,再操作一次git pull,然后它会提示你输入账号密码,
第一次输入正确之后,下次使用git pull 以及git push 都无需账号密码了。
四、合并分支
关于合并分支,无非就 rebase 和 merge
推荐这篇文章,作者写的很细,讲述了2者的优缺点
下面是合并步骤
#切换到master分支拉取最新代码
git checkout master
git pull
#切换到需要合并的分支
git checkout dev
#切换到dev分支后, 就是修改代码
#修改完了, 就正常提交代码-------git commit
#如果有多次dev分支的提交,就合并,只有一次可以不合并
git rebase -i master //合并提交 并he
#合并dev的commit 并将master内容合并到local
git rebase -i master---->解决冲突--->git rebase --continue
#再起切换到master
git checkout master
#将dev分支合并到master
git merge dev
#推送到远程仓库
git push
忽略文件 .gitignore
这个文件的作用,会去忽略一些不需要纳入Git管理这种,我们也不希望出现在未跟踪文件列表。
那么我们来看看如何配置该文件信息。
# 此行为注释 会被Git忽略
# 忽略 node_modules/ 目录下所有的文件
node_modules
# 忽略所有.vscode结尾的文件
.vscode
# 忽略所有.md结尾的文件
*.md
# 但README.md 除外
!README.md
# 会忽略 doc/something.txt 但不会忽略doc/images/arch.txt
doc/*.txt
# 忽略 doc/ 目录下所有扩展名为txt文件
doc/**/*.txt
使用方式
第一次构建项目时,先到远程代码管理平台创建一个库
本地新见一个项目文件夹,执行
git init //初始本地git
当线上存在库时,拉取到本地
//先拉取master分支的代码
git clone xxx.git
//创建本地dev分支并关联线上dev分支
git checkout -b dev origin/dev
提交到远程
//添加修改到缓存
git add .
//提交到本地库
git commit -m '备注'
//提交到远程仓库
git push
如果提示无法提交,可以先尝试git pull origin dev 拉取下dev分支
五、结合vscode编辑器,可视化git
问题集
(以前的忘了,遇到在更新)
问题一
If no other git process is currently running, this probably means a
git process crashed in this repository earlier. Make sure no other git
process is running and remove the file manually to continue.
翻译
如果当前没有其他git进程正在运行,则可能意味着
git进程早些时候在此存储库中崩溃了。确保没有其他git
进程正在运行,请手动删除文件以继续。
解决方法
rm -f ./.git/index.lock
问题二
fatal: The current branch dev has no upstream branch.
To push the current branch and set the remote as upstream, use
git push --set-upstream origin dev
找不到上级分支
解决方法
git push --set-upstream origin dev
问题三
误操作导致分支合并,或者回退到其他版本
解决方法
查看本文的 回退到指定的commit
问题四
! [rejected] master -> master (non-fast-forward)
error: failed to push some refs to 'https://192.168.0.253/trc/c0304-animalhusbandry-web.git'
hint: Updates were rejected because the tip of your current branch is behind
hint: its remote counterpart. Integrate the remote changes (e.g.
hint: 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.
问题五
! [remote rejected] master -> master (pre-receive hook declined)
出现原因,线上仓库未初始化,为空,
解决,到线上仓库初始化README
原因二 没有权限
解决方式
问题六
he file will have its original line endings in your working directory
不同系统对换行的识别不到位导致的
解决设置换行
git config --global core.autocrlf false
问题 七
error: failed to push some refs to 'https://192.168.0.253/trc/c0304-animalhusbandry-web.git'
线上与线下代码未同步导致
解决:拉取对应分支
git pull --rebase origin master
问题八
git 如何把已经提交的 commit 「拿到」其他分支作为变更继续提交?
git log 找到<commit id>
git checkout 你要提交的分支
git cherry-pick 要提交的<commit id>
问题九
如何强制用本地代码覆盖线上仓库
//本地需要有修改,同时强制覆盖,是以当前本地的节点时间覆盖掉线上的节点时间类似插队
//配合git reset 达到使线上回退到指定版本
git push origin master --force
以上是关于万字干货,git常用命令用法知识总结的主要内容,如果未能解决你的问题,请参考以下文章