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 GPLcommit 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 commitgit 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 相关常用命令的主要内容,如果未能解决你的问题,请参考以下文章

Git 常用基本命令

VSCode自定义代码片段——git命令操作一个完整流程

VSCode自定义代码片段15——git命令操作一个完整流程

VSCode自定义代码片段15——git命令操作一个完整流程

:常用工具命令第25节:常用命令 - Git命令

Git相关内容