万字干货,git常用命令用法知识总结

Posted MmM豆

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了万字干货,git常用命令用法知识总结相关的知识,希望对你有一定的参考价值。

安装

这个百度安装就行了,

更新

git update(已经被弃用,也能使用,忘记新命令时,输入会提示你最新命令)


windows(最新更新命令)

`git update-git-for-windows

mac (没有用mac,大家自己用git update试试)

tips2.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分支。
  • 工作区
    • 本地项目存放文件的位置
    • 可以理解成图上的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者的优缺点

你真的懂git rebase吗

下面是合并步骤

#切换到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常用命令用法知识总结的主要内容,如果未能解决你的问题,请参考以下文章

万字干货,git常用命令用法知识总结

干货收藏!总结常用 Git 命令清单

保姆级Git入门教程,万字详解

常用Git命令总结#yyds干货盘点#

重磅干货 | 五万字长文总结 C/C++ 知识(下)

重磅干货 | 五万字长文总结 C/C++ 知识(上)