Git使用大全:一篇文章搞定Git

------《Git使用大全:一篇文章搞定Git》

  • 一、前提知识
    • 1、四个区
    • 2、关键词
    • 3、四种状态
  • 二、配置SSH
    • 1、确认自己是否已经拥有SSH
    • 2、如果没有SSH就需要去生成
  • 三、Git命令大全
    • 1、git config
    • 2、git init
    • 3、git clone
    • 4、git add
    • 5、git commit
    • 6、git checkout
    • 7、git pull
    • 8、git push
    • 9、git status
    • 10、git log
    • 11、git diff
    • 12、git clean
    • 13、git reset
    • 14、git revert
    • 15、git switch
    • 16、git merge
    • 17、git remote
    • 18、git stash
    • 19、git tag
    • 20、git show
  • 四、Git cherry-pick
  • 五、Git merge与Git rebase区别
  • Git锻炼小游戏地址

一、前提知识

1、四个区

工作区 :代码在本地存储的目录位置
暂存区 :git可以追踪的代码(工作区可以将代码添加到暂存区(add))——临时存储
本地库 :暂存区的代码可以提交到本地库(commit),并生成对应的版本 ——生成历史版本
远程库:(远程库:如github)本地区的代码可以提交到远程库(push),并生成对应的版本 —存储在远端

2、关键词

HEAD:当前版本的指针,当切换本地版本的时候会快速指向指定版本文件
master: git为我们创建主分支
origin: 远程仓库的名称

3、四种状态

Untracked: 未跟踪, 此文件在文件夹中, 但并没有加入到git库, 不参与版本控制. 通过git add 状态变为Staged.
Unmodify: 文件已经入库, 未修改, 即版本库中的文件快照内容与文件夹中完全一致. 这种类型的文件有两种去处, 如果它被修改, 而变为Modified. 如果使用git rm移出版本库, 则成为Untracked文件
Modified: 文件已修改, 仅仅是修改, 并没有进行其他的操作. 这个文件也有两个去处, 通过git add可进入暂存staged状态, 使用git checkout 则丢弃修改过, 返回到unmodify状态, 这个git checkout即从库中取出文件, 覆盖当前修改
Staged: 暂存状态. 执行git commit则将修改同步到库中, 这时库中的文件和本地文件又变为一致, 文件为Unmodify状态. 执行git reset HEAD filename取消暂存, 文件状态为Modified

二、配置SSH

需要配置ssh的可以看一眼,不需要的可以略过。

1、确认自己是否已经拥有SSH

默认情况下,用户的 SSH 密钥存储在其 ~/.ssh 目录下。 我们需要寻找一对以 id_dsa 或 id_rsa 命名的文件,其中一个带有 .pub 扩展名。 .pub 文件是你的公钥,另一个则是与之对应的私钥。如果没有找到或者没有.ssh目录则需要生成。
a、cd 到你的 ssh目录下。 正常就在~/.ssh下。 没有的话就去找找在哪里

$ open ~/.ssh   mac可以通过指令找到ssh位置
$ cd ~/.ssh

b、ls 展示所有文件

$ ls
id_rsa id_rsa.pub known_hosts 

c、打开id_rsa.pub

  $ cat id_rsa.pub

d、复制内容到你的git的key配置处即可

2、如果没有SSH就需要去生成

打开本地终端,使用如下命令生成ssh公钥和私钥对

ssh-keygen -t rsa -C '[email protected]' 

然后一路回车(-C 参数是你的邮箱地址)
回车然后会出现:

Enter file in which to save the key (/Users/idid/.ssh/id_rsa):

这里可以输入你想定义的文件名称,也可以直接回车
如果你的.ssh/id_rsa已经,则会出现:

/Users/idid/.ssh/id_rsa already exists.
Overwrite (y/n)? y
输入:y  (重新覆盖)
输入:n  (不覆盖)

之后再去查看你的SSH并且写入你的Git Key

三、Git命令大全

1、git config

提交代码时的用户信息
开始前我们需要先设置提交的用户信息,包括用户名和邮箱:

$ git config --global user.name 'runoob'
$ git config --global user.email [email protected]
git config -l 查看当前git环境详细配置

2、git init

初始化,生成.git文件(若该文件隐藏,则使用ls -ah)

3、git clone

git clone [远程仓库地址] #clone下来保持原文件夹名
git clone [远程仓库地址] [想要重命名的文件夹名称] #clone重命名的文件夹名称

4、git add

添加多个文件到缓存区

git add [file1] [file2] ...

添加整个目录到缓存区

git add [dir]

添加全部到缓存区

git add .

git add -u . u指update,将工作区的被修改的文件和被删除的文件提交到暂存区,不包括新增的文件

5、git commit

提交暂存区到本地仓库中: message:提交的备注

git commit -m [message]

提交暂存区的指定文件到仓库区

git commit [file1] [file2] ... -m [message]

加了-a,在 commit 的时候,能帮你省一步 git add ,但也只是对修改和删除文件有效, 新文件还是要 git add

git commit -a

修正你的commit 快速将当前文件修改合并到最新的commit,不会产生新的commit。在提交commit后发现还有部分文件修改忘记提交了可以是用该命令

git commit --amend   

加-m是指直接在后面写上版本的注释,不加-m的话会用一个vim打开文件让你写入massage,有未追踪的文件将会失败,需要add加入暂存区。

6、git checkout

创建新的分支,创建一个dev分支 :

git checkout -b dev

删除本地分支:

git branch -D dev        

切换到dev分支:

git checkout dev

注意:由于检出命令会重置暂存区和工作区,因此,如果工作区或暂存区存在未提交的改动,切换将会失败,此时有两种选择。

  • 第一种做法是提交改动,先使用git add .添加改动到索引(暂存区)以准备提交,并使用git commit -m "提交说明"执行一次提交,然后再切换分支。
  • 第二种做法是丢弃改动,先使用git reset --hard撤销暂存区和工作区的改动,并使用git clean -dxf清理新增文件和文件夹,然后再切换分支。
git checkout .   放弃所有修改文件
git checkout – filename   放弃指定文件

还有另一种丢弃改动的做法是使用 -f 参数进行强制切换,即执行git checkout -f 忽略工作区和暂存区的改动强制进行切换,然后再使用git clean -dxf清理新增文件和文件夹。

本地创建的分支由于未设置上游追踪分支,因此,首次将新分支推送到远程时,不能直接使用git push命令,而应该使用git push 命令,明确指定要推送的的远程仓库和远程分支名。分支推送过一次远程之后,就会和远程建立追踪关系,下次推送就可以直接使用git push命令了。

切换远程分支
需要先将远程分支与本地分支关联

git checkout -b 本地分支名 origin/远程分支名

该命令可以将远程仓库里指定的分支拉取到本地,并在本地创建一个分支与指定远程仓库分支关联起来。并切换到新建的本地分支中。

7、git pull

git pull =  git fetch + git merge  FETCH_HEAD 
git pull --rebase =  git fetch + git rebase FETCH_HEAD

git pull 和 git pull --rebase 命令都是从远端拉取代码,更新我们的仓库
git fetch是将远程库的最新内容拉到本地库,用户在检查了以后决定是否合并到工作区中

  • git merge是将本地的两个分支合并,如果在分支A中执行git merge B,那就是将分支B中的代码合并到分支A中。
  • git pull 则是将远程主机的最新内容拉去到本地库后直接合并到工作区中,即:git pull = git fetch + git merge,这样可能会产生冲突,需要手动解决。
  • git rebase是将提交到某一分支上的所有修改都移至另一分支上。即如果在B分支上使用git rebase A就是将B分支上的修改都变基(移到)A分支上

8、git push

git push

将文件添加到远程仓库

git push -f 

强制提交,当我们本地reset到旧的版本时,然后普通push会被拦截,因为此是本地HEAD指向比远程库还要旧

git push origin [branch-name] 

推送当前本地分支到指定远程分支

push指定的提交commit

$ git push  :
  • 远程仓库名,默认为origin
  • 提交的唯一码
  • 远程分支名

9、git status

git status [file-name] 查看指定文件状态
git status 查看所有文件状态

10、git log

显示所有commit日志

git log 

查看最新3条commit日志数据

git log -3 

git log --pretty=oneline 将日志缩写为单行显示
git log --graph --pretty=oneline --abbrev-commit 查看分支合并情况
git log --oneline --decorate --graph --all 查看分叉历史,包括:提交历史、各个分支的指向以及项目的分支分叉情况。

11、git diff

git diff HEAD -- . 

查看最新本地版本库和工作区所有文件的区别

git diff HEAD -- [file-name] 

查看最新本地版本库和工作区文件的却别

git diff HEAD^ -- [file-name]

查看本地上一个版本和工作区文件的却别

git diff [local branch] origin/[remote branch] 

可以使用以下命令来查看具体文件所做的修改:

git diff commit1 commit2 -- main.js

比较本地分支和远程分支的区别

git diff 命令可以对比两个版本的差异
1、本地工作区和暂存区的diff信息:git diff 或者 git diff file
2、暂存区和版本库的diff信息(使用git add 将工作区修改保存到了暂存区后):git diff --cached
3、版本库中不同commit、分支的diff信息(使用git commit 将暂存区修改提交到了版本库):git diff commit1 commit2 或 git diff branch1 branch2

12、git clean

git clean -df 加-d是指包含目录,加-f是指强制,删除所有未跟踪的文件

13、git reset

reset命令有3种方式:

git reset --soft HEAD~1:

回退到某个版本,只回退(撤销)commit,不会(撤销)add。如果还要提交,直接commit即可

git reset --mixed HEAD~1:

此为默认方式,不带任何参数的git reset,即回退(撤销)commit和add,工作区不变。

git reset --hard HEAD~1:

彻底回退到某个版本,撤销commit、add、和工作区修改,本地的源码也会变为上一个版本的内容(危险)

14、git revert

git revert -n [commit-id]
git revert -n HEAD^^
  • reset 切换版本是会删除丢弃最新的版本的,HEAD会直接跳到指定版本,但是还是可以通过reflog找回。
  • revert 会将指定的bug版本视为bug版,会将当前版本中的bug版的代码删除,生成新的commit覆盖掉当前commit,但是commit-id是不会变的。

15、git switch

git switch -c [branch-name] 

创建新分支并切换到该分支

git switch [branch-name] 

切换到已有分支

16、git merge

git merge [branch-name] 

用于合并指定分支到当前分支

git merge --quit 

退出当前分支合并,当合并后冲突很多,要撤回合并分支就可以用这个命令

17、git remote

git remote add origin 

远程地址 关联远程仓库

git remote 

查看本地添加了哪些远程分支地址

git remote -v 

查看本地添加了哪些远程分支地址更详细信息

git remote remove origin 

删除本地指定的远程地址

git remote update origin

更新远端分支

18、git stash

git stash

隐藏当前工作的修改
如果不隐藏自己修改的半成品代码,就会发生切换到别的分支后,将然后自己的半成品代码带入其他分支,这样就发生很多不必要的麻烦。

git stash save message 

执行存储时,添加备注,方便查找,只有git stash 也要可以的,但查找时不方便识别。

git stash list 

查看隐藏的工作信息列表

git stash drop 

删除隐藏的工作信息

git stash pop 

恢复隐藏的工作信息,同时删除隐藏的工作信息

git stash apply [stash@{0}] 

恢复指定的隐藏工作信息,但是不会删除隐藏的工作信息

19、git tag

tag是啥?直接上图
Git使用大全:一篇文章搞定Git_第1张图片

添加tag

git tag tag名
git tag versin--0.0.1

添加带备注的tag

tag git tag -a tag名 -m '备注信息'

给过去的commit加上tag

git tag tag名 commit号

删除本地tag

git tag -d tag名

删除远端tag

git push origin --delete tag名

提交tag

git push origin tag名

20、git show

展示这次都修改了哪些文件

git show --name-only <commit_sha1>

四、Git cherry-pick

对于多分支的代码库,将代码从一个分支转移到另一个分支是常见需求。

这时分两种情况。

  • 一种情况是,你需要另一个分支的所有代码变动,那么就采用合并(git merge)。
  • 另一种情况是,你只需要部分代码变动(某几个提交),这时可以采用 Cherry pick。
 
$ git cherry-pick 

git cherry-pick命令的作用,就是将指定的提交(commit)应用于其他分支。
上面命令就会将指定的提交commitHash,应用于当前分支。这会在当前分支产生一个新的提交,当然它们的哈希值会不一样。

举例来说,代码仓库有master和feature两个分支。

 
    a - b - c - d   Master
         \
           e - f - g Feature


现在将提交f应用到master分支

 
# 切换到 master 分支
$ git checkout master
 
# Cherry pick 操作
$ git cherry-pick f


上面的操作完成以后,代码库就变成了下面的样子。

 
    a - b - c - d - f   Master
         \
           e - f - g Feature


从上面可以看到,master分支的末尾增加了一个提交f。

git cherry-pick命令的参数,不一定是提交的哈希值,分支名也是可以的,表示转移该分支的最新提交。

 
$ git cherry-pick feature


上面代码表示将feature分支的最近一次提交,转移到当前分支。

cherry-pick 多次提交

$ git cherry-pick  

五、Git merge与Git rebase区别

git pull 与 git pull --rebase的区分实际上就是git merge与git rebase的区分。为了方便区分我们使用两个不同名分支进行讲解。
git merge是合并分支。是将yang分支合并到master分支之后,master分支的代码有所改动,会自动commit,生成一个新的结点,并且不会影响之前两分支的提交节点。
合并前:
Git使用大全:一篇文章搞定Git_第2张图片

合并后:
Git使用大全:一篇文章搞定Git_第3张图片

执行的合并命令:

$ git checkout master
$ git merge yang

git rebase是变基。是将yang分支变基到master分支,就是将yang分支的代码改动完全合并到master分支,不会生成新的结点。
变基前:

Git使用大全:一篇文章搞定Git_第4张图片

变基后:
Git使用大全:一篇文章搞定Git_第5张图片

执行的变基命令:

$ git checkout yang
$ git rebase master

然后再执行如下命令,是master分支指向最新节点
$

 git checkout master
$ git merge yang

由此可以看出merge和rebase的区别:
merge 会多出一次 commit生成一个新节点,rebase不会。
merge 的提交树是非线性的,rebase 的提交树是线性的(通过重写提交历史)。

Git锻炼小游戏地址

学习一遍之后来试试这个闯关小游戏!!
git闯关小游戏

你可能感兴趣的:(Git,一篇文章搞定Android,git,github,ssh)