Git常见命令和遇到问题的解决办法

一、Git整体理解

Git代码管理是分布式管理方式系统,优点在于其极高的安全性和非常强大的分支管理。


image.png
  • 工作区(working directory): 就是本地的代码区,电脑能看到的目录,就是工作区.

  • 暂存区(Index):工作区下有一个隐藏的'.git'文件,其主要作用是存储Git自动创建的第一个master分支,还有指向master分支的HEAD指针.还有一个最重要的stage的暂存区.需要提交的文件修改通通放到暂存区,然后一次性提交到暂存区的所有修改.

  • 本地仓: 本地的个人仓库.管理着个人的代码的版本信息.

  • 远程仓: 线上的仓库.管理着推送到服务器的代码版本.

过程一、有工作区<->暂存区

  • 工作区->暂存区:
    用git add . 添加所有的修改或者git add <文件名>添加单个指定的文件修改到暂存区中.
  • 暂存区->工作区:
    (1)git rm --cached "文件路径" 不删除物理文件,紧将git的缓存删除.
    (2)git rm --f "文件路径" 不仅将该文件从缓存中 删除,还将物理文件删除(不会放到垃圾桶).
    例如: git rm -rf .DS_Store
    (3)git reset <版本号> 利用版本库清空暂存区.原理:将当前分支重设(reset)到指定的<commit>或者HEAD(默认,如果不指定commit,默认是HEAD,即最新的一次提交)
    --hard
    git reset --hard <commit号>重设(reset)index和working directory,自从<commit>以来在working directory中的任何改变都被丢弃,并把HEAD指向<commit>
    --soft
    git reset --soft <commit号>index和working directory中的内容不作任何改变,仅仅把HEAD指向<commit>。这个模式的效果是,执行完毕后,自从<commit>以来的所有改变都会显示在git status的"Changes to be committed"中

过程二、由暂存区<->本地仓库

  • 暂存区->本地仓库
    用git commit -m'本次commit的描述'
  • 本地仓库->暂存区
    (1) git reset <版本号> 利用版本库清空暂存区.原理:将当前分支重设(reset)到指定的<commit>或者HEAD(默认,如果不指定commit,默认是HEAD,即最新的一次提交)
    (2) --hard
    git reset --hard <commit号>重设(reset)index和working directory,自从<commit>以来在working directory中的任何改变都被丢弃,并把HEAD指向<commit>
    (3) --soft
    git reset --soft <commit号>index和working directory中的内容不作任何改变,仅仅把HEAD指向<commit>。这个模式的效果是,执行完毕后,自从<commit>以来的所有改变都会显示在git status的"Changes to be committed"中.退回到该次commit提交,但是该版本之后所有的修改都没有了,如果想要恢复,就要试图从还未关闭的终端中找到你想要的退回的版本号,或者用git reflog查找你想要的commit版本号.继续用git reset --soft <commit号>回退

过程三、由本地仓->远程仓库

git push

说明:三种git add的区别

-git add .提交新文件(new)和被修改(modified)的文件,不包括被删除(deleted)的文件

  • git add -u提交被修改(modified)和被删除(deleted)的文件,不包括新文件(new)
  • git add -A 提交所有变化

1、在本地创建一个Git管理的项目

  • 从线上拉项目到本地
    git clone "项目的地址路径"克隆一个Git管理的项目到本地
  • 本地项目上传线上
    git init
    git remote add origin "地址url"

2、Git上的常用查看操作

(1)查看文本内容
cat<文件名>
(2)查看git的状态
git status会告诉你在当前的分支上git的情况(有没有修改,修改的文件是什么等)

3、查看更详细的文件修改

git diff查看所有文件的不同
git diff <文件名>查看指定文件的不同
diff是difference的缩写,只能查看还未add(还没加入到暂存区)的修改

4、查看所有的commit信息

git log
git log --pretty=oneline更简洁的查看log信息(只有commit号和描述信息)

5、查看所有的git操作过的命令,可以找到删除了的commit号

git reflog

6、查看分支合并图

git log --graph

四、冲突处理

需要把

<<<<<<HEAD
=======
>>>>>>

中间的删掉

五、Git分支操作

1、分支基本操作

  • 分支的创建和切换
    git branch "分支名"创建一个分支git checkout "分支名"切换到该分支
    创建并切换到该分支git checkout -b "分支名"
  • 列出所有的分支
    git branch列出本地分支 用*标记当前的分支
    git branch -a列出远程分支
  • 合并分支
    git merge "分支名"合并指定分支到当前分支
    git rebase "分支名"合并指定分支到当前分支
    两者的区别在于会不会保留分支操作的记录,前者记录,后者不记录.建议用merge
  • 删除分支
    删除本地分支:git branch -d "分支名"
    强制删除本地分支:git branch -D "分支名"
    删除远程分支:git push origin :<分支名>(轻易不要动啊)
    如果提示the branch XXX is not fully merged(XXX分支有没合并到当前分支的内容)
  • 本地新建了一个分支要推送到线上,需要设置关联或者追踪
    第一次push:git push origin 本地分支名:远程分支名
  • 远程端生成了一个新的分支,拉取到本地
    先关联远程端分支到本地:git branch --set-upstream-to=origin/<线上分支名> <本地分支名>
    然后git pull

六、bug的分支

用issue作为分支的开头标记,当有一个bug出现需要改的时候,先拉取一个issue分支,修改并合并到开发分支上,然后删除issue分支。

七、feature分支

  • 开发新的功能的时候,最好拉取一个新的分支,以feature开头。
  • 丢掉一个没有合并过的分支,即删除分支
    git branch -D <分支名>强制删除该分支内容

八、暂存的使用

1、git stash暂存
2、 git stash list查看所有的暂存
3、git stash apply从暂存开始执行,但是stash内容不会删除
4、 git stash drop删除暂存
5、git stash pop回复暂存的同时删除暂存
6、git stash apply stash@{0}恢复指定的暂存

九、远程仓的操作

  • 查看远程仓的信息
    git remote
    git remote -v显示更详细的信息
  • 将分支推送到远程仓
    git push origin 本地分支名:远程分支名

十、标签的使用

标签智能在master分支上使用,尽量写清楚所有的修改,为了万一的版本回退做好描述工作。
1、git tag <name>新建一个标签
2、git tag -a <name> -m'指定的标签信息'
3、git show <tag名字>查看详细的tag信息
4、git tag查看所有的tag名字
5、git tag -d <标签名字>删除一个标签
6、git push origin < 标签名>推送标签到远程
7、git push origin --tags一次性推送所有未推送的标签
8、删除远程仓上的tag

  • 先删除本地的标签:git tag -d <tag名字>
  • 删除远程端的标签:git push origin :tag名字

十一、Git配置全局信息

1、配置作者名称
git config --global user.name "Your Name"
2、配置个人邮箱
git config --global user.email "email@example.com"
3、配置git的颜色(文件名会标记上颜色)
git config --global color.ui true

十二、Linux的一些简单操作和一些符号的解释

1、目录/文件的操作
-mkdir "目录名" 在当前路径下创建一个文件夹

  • mvdir "目录1" "目录2"移动或者重命名一个目录 (如果目录2不存在,就直接修改目录1的名称为目录2)

  • rmdir"目录名" 删除一个目录

  • touch创建一个文件

  • vim "文件名 编辑文件,如果文件不存在,就创建并进入编辑.

  • 删除一个文件
    sudo rm -rf <文件名> 在上帝权限下删除,可以删除一个该用户没有权限的文件(包括系统文件),不建议使用
    rm <文件名>能删除当前用户权限下的文件
    2、转换目录

  • cd + "路径"进入该文件目录下(也可以将文件直接拖进来)

  • cd ..回到上级目录

-cd . 当前目录 cd / 回到根目录

  • cd test.rtf 不可用. 不能cd到文件里.只能cd到目录.
    报错信息: -bash: cd: test.rtf: Not a directory
    3、拷贝/移动/删除
    cp "需要拷贝的文件路径" "目标地址路径"
    拷贝文件 例如: cp /Users/goulela/Desktop/test.rtf /Users/goulela/Desktop/文件夹2
    mv "需要移动的文件路径" "目标地址路径"
    移动文件 例如: mv 文件夹2 /Users/goulela/Desktop/创建文件夹/文件夹
    4、显示操作
    -file "文件名"显示文件的类型

  • wc "文件名"统计文件的字符数,词数,行数

  • pwd查看当前所在的目录

  • ls 显示当前路径下有什么文件

  • ls + "目录名" 显示特定的路径下有什么文件

  • ls -w 显示中文

  • ls -l 详细信息

  • ls -a 显示所有文件,包括隐藏文件

5、时间操作

  • data显示系统的当前日期和时间
  • cal显示日历
    6、网络与通信
  • ping "url" 给一个远程主机发送 回应请求
  • 终止ping打印 control + c
  • who 列出当前登录的所有用户
  • whoami显示当前正进行操作的用户名

十三、符号解释

1、-r 就是向下递归,不管有多少级目录,一并删除
2、-f 就是直接强行删除,不作任何提示的意思
3、-rf 向下递归强制删除

十四、显示安装详细信息

在安装命令后面添加--verbose,可以查看打印详细信息

十五、git config

配置git的相关参数
git一共有3个配置文件:
1、仓库级的配置文件:在仓库的.git/.gitconfig,该配置文件只对所在的仓库有效。
2、全局配置文件:Mac系统在~/.gitconfig,Windows系统在C:\Users\<用户名>\.gitconfig
3、系统级的配置文件:在Git的安装目录下(Mac系统下安装目录在/usr/local/git)的etc文件夹下的gitconfig

# 查看配置信息
# --local:仓库级,--global:全局级,--system:系统级
$ git config <--local | --global | --system> -l

# 查看当前生效的配置信息
$ git config -l

# 编辑配置文件
# --local:仓库级,--global:全局级,--system:系统级
$ git config <--local | --global | --system> -e

# 添加配置项
# --local:仓库级,--global:全局级,--system:系统级
$ git config <--local | --global | --system> --add <name> <value>

# 获取配置项
$ git config <--local | --global | --system> --get <name>

# 删除配置项
$ git config <--local | --global | --system> --unset <name>

# 配置提交记录中的用户信息
$ git config --global user.name <用户名>
$ git config --global user.email <邮箱地址>

# 更改Git缓存区的大小
# 如果提交的内容较大,默认缓存较小,提交会失败
# 缓存大小单位:B,例如:524288000(500MB)
$ git config --global http.postBuffer <缓存大小>

# 调用 git status/git diff 命令时以高亮或彩色方式显示改动状态
$ git config --global color.ui true

# 配置可以缓存密码,默认缓存时间15分钟
$ git config --global credential.helper cache

# 配置密码的缓存时间
# 缓存时间单位:秒
$ git config --global credential.helper 'cache --timeout=<缓存时间>'

# 配置长期存储密码
$ git config --global credential.helper store

十六、Git clone

从远程仓库克隆一个版本库到本地。

# 默认在当前目录下创建和版本库名相同的文件夹并下载版本到该文件夹下
$ git clone <远程仓库的网址>

# 指定本地仓库的目录
$ git clone <远程仓库的网址> <本地目录>

# -b 指定要克隆的分支,默认是master分支
$ git clone <远程仓库的网址> -b <分支名称> <本地目录>

十七、Git init

初始化项目所在目录,初始化后会在当前目录下出现一个名为.git的目录。

# 初始化本地仓库,在当前目录下生成 .git 文件夹
$ git init

十八、git status

查看本地仓库的状态

# 查看本地仓库的状态
$ git status

# 以简短模式查看本地仓库的状态
# 会显示两列,第一列是文件的状态,第二列是对应的文件
# 文件状态:A 新增,M 修改,D 删除,?? 未添加到Git中
$ git status -s

十九、git remote

操作远程库

# 列出已经存在的远程仓库
$ git remote

# 列出远程仓库的详细信息,在别名后面列出URL地址
$ git remote -v
$ git remote --verbose

# 添加远程仓库
$ git remote add <远程仓库的别名> <远程仓库的URL地址>

# 修改远程仓库的别名
$ git remote rename <原远程仓库的别名> <新的别名>

# 删除指定名称的远程仓库
$ git remote remove <远程仓库的别名>

# 修改远程仓库的 URL 地址
$ git remote set-url <远程仓库的别名> <新的远程仓库URL地址>

二十、git branch

操作git的分支命令

# 列出本地的所有分支,当前所在分支以 "*" 标出
$ git branch

# 列出本地的所有分支并显示最后一次提交,当前所在分支以 "*" 标出
$ git branch -v

# 创建新分支,新的分支基于上一次提交建立
$ git branch <分支名>

# 修改分支名称
# 如果不指定原分支名称则为当前所在分支
$ git branch -m [<原分支名称>] <新的分支名称>
# 强制修改分支名称
$ git branch -M [<原分支名称>] <新的分支名称>

# 删除指定的本地分支
$ git branch -d <分支名称>

# 强制删除指定的本地分支
$ git branch -D <分支名称>

二十一、git checkout

检出命令,用于创建,切换分支等

# 切换到已存在的指定分支
$ git checkout <分支名称>

# 创建并切换到指定的分支,保留所有的提交记录
# 等同于 "git branch" 和 "git checkout" 两个命令合并
$ git checkout -b <分支名称>

# 创建并切换到指定的分支,删除所有的提交记录
$ git checkout --orphan <分支名称>

# 替换掉本地的改动,新增的文件和已经添加到暂存区的内容不受影响
$ git checkout <文件路径>

二十二、git cherry-pick

把已经提交的记录合并到当前分支。

# 把已经提交的记录合并到当前分支
$ git cherry-pick <commit ID>

二十三、git add

把要提交的文件的信息添加到暂存区中。当使用git commit时,将依据暂存区中的内容类进行文件的提交。

# 把指定的文件添加到暂存区中
$ git add <文件路径>

# 添加所有修改、已删除的文件到暂存区中
$ git add -u [<文件路径>]
$ git add --update [<文件路径>]

# 添加所有修改、已删除、新增的文件到暂存区中,省略 <文件路径> 即为当前目录
$ git add -A [<文件路径>]
$ git add --all [<文件路径>]

# 查看所有修改、已删除但没有提交的文件,进入一个子命令系统
$ git add -i [<文件路径>]
$ git add --interactive [<文件路径>]

二十四、git commit

将暂存区中的文件提交到本地仓库中。

# 把暂存区中的文件提交到本地仓库,调用文本编辑器输入该次提交的描述信息
$ git commit

# 把暂存区中的文件提交到本地仓库中并添加描述信息
$ git commit -m "<提交的描述信息>"

# 把所有修改、已删除的文件提交到本地仓库中
# 不包括未被版本库跟踪的文件,等同于先调用了 "git add -u"
$ git commit -a -m "<提交的描述信息>"

# 修改上次提交的描述信息
$ git commit --amend

二十五、git fetch

从远程仓库获取最新的版本到本地的tmp分支上。

# 将远程仓库所有分支的最新版本全部取回到本地
$ git fetch <远程仓库的别名>

# 将远程仓库指定分支的最新版本取回到本地
$ git fetch <远程主机名> <分支名>

二十六、git merge

合并分支

# 把指定的分支合并到当前所在的分支下
$ git merge <分支名称>

二十七、git diff

比较版本之间的差异

# 比较当前文件和暂存区中文件的差异,显示没有暂存起来的更改
$ git diff

# 比较暂存区中的文件和上次提交时的差异
$ git diff --cached
$ git diff --staged

# 比较当前文件和上次提交时的差异
$ git diff HEAD

# 查看从指定的版本之后改动的内容
$ git diff <commit ID>

# 比较两个分支之间的差异
$ git diff <分支名称> <分支名称>

# 查看两个分支分开后各自的改动内容
$ git diff <分支名称>...<分支名称>

二十八、git pull

从远程仓库获取最新版本合并到本地。
首先会执行git fetch,然后执行 git merge,把获取的分支的HEAD合并到当前分支。

# 从远程仓库获取最新版本。
$ git pull

二十九、git push

把本地仓库的提交推送到远程仓库

# 把本地仓库的分支推送到远程仓库的指定分支
$ git push <远程仓库的别名> <本地分支名>:<远程分支名>

# 删除指定的远程仓库的分支
$ git push <远程仓库的别名> :<远程分支名>
$ git push <远程仓库的别名> --delete <远程分支名>

三十、git log

把本地仓库的提交推送到远程仓库

# 把本地仓库的分支推送到远程仓库的指定分支
$ git push <远程仓库的别名> <本地分支名>:<远程分支名>

# 删除指定的远程仓库的分支
$ git push <远程仓库的别名> :<远程分支名>
$ git push <远程仓库的别名> --delete <远程分支名>

三十一、git reset

还原提交记录

# 重置暂存区,但文件不受影响
# 相当于将用 "git add" 命令更新到暂存区的内容撤出暂存区,可以指定文件
# 没有指定 commit ID 则默认为当前 HEAD
$ git reset [<文件路径>]
$ git reset --mixed [<文件路径>]

# 将 HEAD 的指向改变,撤销到指定的提交记录,文件未修改
$ git reset <commit ID>
$ git reset --mixed <commit ID>

# 将 HEAD 的指向改变,撤销到指定的提交记录,文件未修改
# 相当于调用 "git reset --mixed" 命令后又做了一次 "git add"
$ git reset --soft <commit ID>

# 将 HEAD 的指向改变,撤销到指定的提交记录,文件也修改了
$ git reset --hard <commit ID>

三十二、git revert

生成一个新的提交来撤销某次提交,此次提交之前的所有提交都会被保留。

# 生成一个新的提交来撤销某次提交
$ git revert <commit ID>

三十三、删除掉本地不存在的远程分支

多人合作开发时,如果远程的分支被其他开发删除掉,在本地执行 git branch --all 依然会显示该远程分支,可使用下列的命令进行删除:

# 使用 pull 命令,添加 -p 参数
$ git pull -p

# 等同于下面的命令
$ git fetch -p
$ git fetch --prune origin
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,126评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,254评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,445评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,185评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,178评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,970评论 1 284
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,276评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,927评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,400评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,883评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,997评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,646评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,213评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,204评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,423评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,423评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,722评论 2 345

推荐阅读更多精彩内容

  • 1. 安装 Github 查看是否安装git: $ git config --global user.name "...
    Albert_Sun阅读 13,631评论 9 163
  • 一. Git整体理解 Git代码管理是分布式管理方式系统.优点在于其极高的安全性和非常强大的分支管理. 工作区(w...
    Mccc_阅读 17,712评论 18 38
  • Add & Commit git init 初始化一个 Git 仓库(repository),即把当前所在目录变成...
    冬絮阅读 4,789评论 0 8
  • 安装Git Git的下载地址:Git官网下载地址 Git本地仓库和命令 配置用户 下载完Git后,右键会有一个Gi...
    TokyoZ阅读 4,488评论 1 7
  • 第一部分是文档,为了日后查看方便放到了前边[可能敲错了,详见阮一峰老师的文章]http://www.ruanyif...
    白璞1024阅读 1,014评论 0 49