------《Git使用大全:一篇文章搞定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 'xxx@xxx.com'
然后一路回车(-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
但是每次提交可能还会出现,需要你每次去输入密码的情况,可以通过下面这行命令,为这个 SSH key 设置一个密码
ssh-add ~/.ssh/id_rsa
三、Git命令大全
1、git config
提交代码时的用户信息
开始前我们需要先设置提交的用户信息,包括用户名和邮箱:
$ git config --global user.name 'runoob'
$ git config --global user.email test@runoob.com
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 <remotename> <commit SHA>:<remotebranchname>
<remotename>
远程仓库名,默认为origin<commit SHA>
提交的唯一码<remotebranchname>
远程分支名
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是啥?直接上图
添加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 <commitHash>
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 <HashA> <HashB>
五、Git merge与Git rebase区别
git pull 与 git pull --rebase的区分实际上就是git merge与git rebase的区分。为了方便区分我们使用两个不同名分支进行讲解。
git merge是合并分支。是将yang分支合并到master分支之后,master分支的代码有所改动,会自动commit,生成一个新的结点,并且不会影响之前两分支的提交节点。
合并前:
合并后:
执行的合并命令:
$ git checkout master
$ git merge yang
git rebase是变基。是将yang分支变基到master分支,就是将yang分支的代码改动完全合并到master分支,不会生成新的结点。
变基前:
变基后:
执行的变基命令:
$ git checkout yang
$ git rebase master
然后再执行如下命令,是master分支指向最新节点
$
git checkout master
$ git merge yang
由此可以看出merge和rebase的区别:
merge 会多出一次 commit生成一个新节点,rebase不会。
merge 的提交树是非线性的,rebase 的提交树是线性的(通过重写提交历史)。
git pull和git fetch的区别
git pull和git fetch都是用来更新本地仓库的操作。
- git pull:是git fetch和git merge的组合操作。它会从远程仓库获取最新的代码,并且将其合并到当前分支上。简而言之,git pull相当于两步操作的合并:先执行git fetch获取最新代码,然后将远程分支合并到当前分支上。
- git fetch:则是只获取远程仓库的最新代码,但是不会自动合并到当前分支上。它会将远程分支的最新提交记录下载到本地,然后你可以随时通过git merge命令或者使用git log来查看远程修改的情况
Git锻炼小游戏地址
学习一遍之后来试试这个闯关小游戏!!
git闯关小游戏