Git 相关常用命令
Posted 一吃三大碗
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Git 相关常用命令相关的知识,希望对你有一定的参考价值。
基础命令
pwb,命令是用于显示当前的目录。
mkdir fileName 用于创建文件。
ls 用于显示当前文件列表。
cd filename 用于进入到指定文件 按tab键可补全输入。
../ 命令用于返回上一级目录。
删除空目录rmdir 目录
。
删除文件夹 ,无论文件是否为空,使用-rf
即可,即rm -rf 目录(删除就没法回收了,谨用!);-r:向下递归,不管有多少目录,一并删除。-f:强制删除,不做任何提示。
强制删除文件 rm -f 目录名。
cd ~ 返回根目录
cat 查看
配置环境变量
vim ~/.bash_profile
覆盖
brew link --overwrite cocoapods
GIT
GIT init
a. mkdir filename
;
b. $ git init
创建一个新的仓库, 在新建的文件夹下回创建一个.git
的目录。该目录用来跟踪管理版本库,如果没看到使用 ls -ah
就可以看到隐藏的文件;
c. $ git add .
把文件添加到仓库;
d. $ git commit -m "本次提交的说明"
,把文件提交到仓库;成功会提示 1. n file changed (-文件被改动);n insertions (-文件被插入);
创建分支
git checkout -t origin/master -b feat-trusteeship // feat-trusteeship 为你自己起的分支名字
本地分支推送到远程
git push origin feature-branch:feature-branch //推送本地的feature-branch(冒号前面的)分支到远程origin的feature-branch(冒号后面的)分支(没有会自动创建)
为推送当前分支并建立与远程上游的跟踪,git push --set-upstream origin feature-branch
删除本地分支
git branch -D feature-branch
删除运程分支
git push origin --delete feature-branch
工作区和暂存区
工作区 (worker directory)
就是你在笔记本上看到的目录文件 。
版本库(repository)
工作区隐藏一个目录.git
,这个不算工作区,而是Git 版本管理库
。
Git版本管理库里存了好多东西,其中最重要的就是被称之为stage(或者叫index)
的暂存区
。还有一个git给我自动创建的master
,以及指向master
的一个指针叫HEAD
。
前面我们把文件往git版本库里添加的时候,分两步执行。
第一步是用git add
把文件添加进去,实际上就是把文件修改添加到暂存区
;
第二步是用git commit
提交更改,实际上就是把暂存区的所有内容提交到当前分支
。
你可以简单理解为,需要提交的文件修改通通放到暂存区
,然后,一次性提交暂存区的所有修改
。
GIT时光穿梭
版本回退 Git reset
像这样,你不断对文件进行修改,然后不断提交修改到版本库里
,每当你觉得文件修改到一定程度的时候,就可以“保存一个快照”
,这个快照在Git中被称为commit
。一旦你把文件改乱了,或者误删了文件,还可以从最近的一个commit恢复
,然后继续工作,而不是把几个月的工作成果全部丢失。
Git查看提交日志 git log
使用 git log
命令查看版本控制系统中文件从最近到最远的提交日志。
Git精简查看提交日志
git log --pertty=online
命令查看 提交的精简日志。
$ git log --pretty=oneline
1094adb7b9b3807259d8cb349e7df1d4d6477073 (HEAD -> master) append GPL
e475afc93c209a690c39c13a46716e8fa000c366 add distributed
eaadf4e385e865d25c48e7ca9c8395c3f7dfaef0 wrote a readme file
Git 版本号
需要友情提示的是,你看到的一大串类似1094adb...
的是commit id
(版本号),
首先,Git
必须知道当前版本是哪个版本,在Git中,用HEAD
表示当前版本
,也就是最新的提交1094adb...
,
上一个版本就是HEAD^
,
上上一个版本就是HEAD^^
,
当然往上100个版本写100个^比较容易数不过来,所以写成HEAD~100
。
Git版本回退
使用 $ git reset --hard HEAD^
命令
Git回退到指定版本
$ git reset --hard 1094a(commit id)
;版本号没必要写全,前几位就可以了,Git会自动去找。
Git的版本回退速度非常快,因为Git在内部有个指向当前版本的HEAD指针,当你回退版本的时候,Git仅仅是把HEAD从指向append GPL:
┌────┐
│HEAD│
└────┘
│
└──> ○ append GPL
│
○ add distributed
│
○ wrote a readme file
改为指向add distributed:
┌────┐
│HEAD│
└────┘
│
│ ○ append GPL
│ │
└──> ○ add distributed
│
○ wrote a readme file
如果有冲突,协作开发保留本地分支,暂存
查找commit id(版本号)
当你用$ git reset --hard HEAD^
回退到add distributed
版本时,再想恢复到append GPL
,就必须找到append GPL
的commit id
。
使用 命令git reflog
用来记录你的每一次命令;
总结
- HEAD指向的版本就是当前版本,因此,Git允许我们在版本的历史之间穿梭,使用命令git reset --hard commit_id。
- 穿梭前,用git log可以查看提交历史,以便确定要回退到哪个版本。
- 要重返未来,用git reflog查看命令历史,以便确定要回到未来的哪个版本。
Git管理修改
用git diff HEAD -- filename
命令可以查看工作区和版本库里面最新版本的区别:
Git撤销修改
方法一
git checkout -- filename
命令的意思就是把文件filename 在工作区修改的全部撤销。这有两种情况:
一种是 filename 自修改后还没有被放到暂存区
,现在,撤销修改就回到和版本库一模一样的状态
;
一种是 filename 已经添加到暂存区后
,又作了修改
,现在,撤销修改就回到添加到暂存区后的状态
。
总之,就是让这个文件回到最近一次git commit
或git add
时的状态。
方法二
用命令git reset HEAD <file>
可以把暂存区的修改撤销掉(unstage),重新放回工作区:
git reset命令既可以回退版本,也可以把暂存区的修改回退到工作区。当我们用HEAD时,表示最新的版本。
场景1 :当你改乱了工作区某个文件的内容,想直接丢弃工作区的修改时,用命令git checkout -- file。
场景2 :当你不但改乱了工作区某个文件的内容,还添加到了暂存区时,想丢弃修改,分两步,第一步用命令git reset HEAD filename
,就回到了场景1,第二步按场景1操作。
场景3 :已经提交了不合适的修改到版本库时,想要撤销本次提交,参考版本回退一节,不过前提是没有推送到远程库。
Git删除文件
git rm filename
删除文件件,然后 git status
查看文件状态,确定之后 git commit -m \'说明文案\'
;
若是删错文件可以使用 ,git checkout --filename
,一件还原文件,无论是修改的还是删除的。
git checkout
其实是用版本库里的版本替换工作区的版本,无论工作区是修改还是删除,都可以“一键还原”。
Git远程仓库
添加远程仓库
现在的情景是,你已经在本地创建了一个Git仓库后,又想在GitHub创建一个Git仓库,并且让这两个仓库进行远程同步,这样,GitHub上的仓库既可以作为备份,又可以让其他人通过该仓库来协作,真是一举多得。
初始创建仓库
git init
git add README.md
git commit -m "first commit"
git remote add origin https://github.com/menyongkang/learnvue.git
git push -u origin master
查看远程库
git remote -v
删除远程源地址
git remote remove origin
添加远程库
关联一个远程库,使用命令git remote add origin 远程地址URL
,比如 git remote add origin https://github.com/menyongkang/learnvue.git
,
关联后, 使用命令git push -u origin master
第一次把本地库的所有内容推送到远程库;
此后,每次本地提交后,只要有必要,就可以使用命令git push origin master推送最新修改;
把本地库
的内容推送到远程
,用git push
命令,实际上是把当前分支master推送到远程
。
由于远程库是空的,我们第一次推送master分支时
,加上了-u
参数,Git不但会把本地的master分支内容推送的远程新的master分支,还会把本地的master分支和远程的master分支关联
起来;
更改远程地址
git remote set-url origin 远程地址URL
或者更改 config 文件中的url。更换url后,git push。
从远程库克隆
假设我们从零开发,那么最好的方式是先创建远程库,然后,从远程库克隆。
勾选Initialize this repository with a README
,这样GitHub
会自动为我们创建一个README.md
文件。创建完毕后,可以看到README.md
文件:
现在,远程库已经准备好了,下一步是用命令git clone克隆一个本地库:
$ git clone https://github.com/menyongkang/XXXX.git
Cloning into \'gitskills\'...
remote: Counting objects: 3, done.
remote: Total 3 (delta 0), reused 0 (delta 0), pack-reused 3
Receiving objects: 100% (3/3), done.
Git创建与合并分支
HEAD
指向的就是当前分支;
当我们创建新的分支
,例如dev时,Git新建了一个指针叫dev
,指向master相同的提交,再把HEAD指向dev
,就表示当前分支在dev上
。
不过,从现在开始,对工作区的修改和提交就是针对dev分支了,比如新提交一次后,dev指针往前移动一步,而master指针不变。
假如我们在dev上的工作完成了,就可以把dev合并到master上。Git怎么合并呢?最简单的方法,就是直接把master指向dev的当前提交,就完成了合并:
Git创建分支
创建dev分支
,然后切换到dev分支; (基于稳定分支master创建分支)
$ git checkout -t origin/master -b feat-trusteeship // feat-trusteeship 为你自己起的分支名字
git checkout
命令加上-b
参数表示创建并切换
,相当于以下两条命令:
$ git branch dev
$ git checkout dev
Switched to branch \'dev\'
Git查看分支
用git branch
命令查看当前分支。
git branch
命令会列出所有分支
,当前分支
前面会标一个*
号。
Git切换分支
使用 git checkout master
命令表示切换到 master 分支。
最新版本的Git提供了新的git switch
命令来切换分支
创建并切换到新的dev分支
,可以使用:
$ git switch -c dev
直接切换到已有的master分支
,可以使用:
$ git switch master
Git合并分支
使用 git merge 合并的目标分支
命令。例如
把dev分支
的工作成果合并
到master分支
:git merge dev
。
$ git merge dev
Updating d46f35e..b17d20e
Fast-forward
readme.txt | 1 +
1 file changed, 1 insertion(+)
git merge
命令用于合并指定分支
到当前分支
。
注意到上面的Fast-forward
信息,Git告诉我们,这次合并是“快进模式”
,也就是直接把master指向dev的当前提交
,所以合并速度非常快。
Git本次提交推送到指定分支
使用 git cherry-pick commit-id
命令。例如
把dev分支
的工作成果推送到
到master分支
。
git log
git chckout master
git pull
git cherry-pick commit-id1, commit -id2
git push
Git删除分支
使用 git branch -d 目标分支
;
$ git branch -d dev
Deleted branch dev (was b17d20e).
删除后,查看branch,就只剩下master分支了:
$ git branch
* master
Git查看合并冲突情况
$ git log --graph --pretty=oneline --abbrev-commit
使用git log --graph
分支合并图.
分支管理策略
Git会用Fast forward模式
,但这种模式下,删除分支后,会丢掉分支信息
。
合并
$ git merge --no-ff -m "merge with no-ff" dev
;
请注意--no-ff
参数,表示禁用Fast forward
。
因为本次合并要创建一个新的commit
,所以加上-m
参数,把commit描述写进去
。
合并分支时,加上--no-ff参数就可以用普通模式合并,合并后的历史有分支,能看出来曾经做过合并,而fast forward合并就看不出来曾经做过合并。
储藏
把当前工作现场“储藏”起来,等以后恢复现场后继续工作:
使用$ git stash
命令。
用git status
查看工作区,就是干净的(除非有没有被Git管理的文件),因此可以放心地创建分支来修复bug。
弹出暂存
把当前工作现场“储藏”起来,等以后恢复现场后继续工作:
使用$ git stash
命令。
用git status
查看工作区,就是干净的(除非有没有被Git管理的文件),因此可以放心地创建分支来修复bug。
git 删除远程分支
git rm -r filename
git add .
git commit -m "rm filename"
git push
.gitignore 文件不生效
.gitignore只能忽略原来没有被跟踪的文件,因此跟踪过的文件是无法被忽略的。因此在网页上可以看到target等目录的存在。
解决方法就是先把本地缓存删除(改变成未track状态),然后再提交:
git rm -r --cached .
git add .
git commit -m ‘update .gitignore’
rebase 的使用
当远程的稳定分支有更新时,基于远程稳定分支创建的,当前分支想同步稳定分支的代码,则执行
- 方法一:merge
git fetch origin
git merge origin/master
- 方法二:是执行rebase来同步变化
git pull --rebase ,他相当执行:
git fetch origin
git rebase origin/master
查看本地分支和所有分支
git branch
查看本地分支git branch --all
查看本地和远程所有分支
git文件名修改后提交远程无变化
修改文件名大小写后重新提交代码,结果发现git status中并未找到该变化,究其原因是默认git配置了忽略大小写敏感
$ git config core.ignorecase true
下面设置大小写敏感为敏感
$ git config core.ignorecase false
这时,再通过git status就能找到你修改文件名大小写后的变更了
注:提交时原文文件删除不了,少麻烦,复制一份,更改哈名称,删除原来的哈
git 修改远程分支名称
首先 git branch -m 旧分支名 新分支名
其次 git push --delete origin 旧分支名
将新分支名推上去 git push origin 新分支名
将新本地分支和远程相连 git branch --set-upstream-to origin/新分支名
以上是关于Git 相关常用命令的主要内容,如果未能解决你的问题,请参考以下文章
VSCode自定义代码片段15——git命令操作一个完整流程