工作区 :代码在本地存储的目录位置
暂存区 :git可以追踪的代码(工作区可以将代码添加到暂存区(add))——临时存储
本地库 :暂存区的代码可以提交到本地库(commit),并生成对应的版本 ——生成历史版本
远程库:(远程库:如github)本地区的代码可以提交到远程库(push),并生成对应的版本 —存储在远端
HEAD:当前版本的指针,当切换本地版本的时候会快速指向指定版本文件
master: git为我们创建主分支
origin: 远程仓库的名称
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 密钥存储在其 ~/.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配置处即可
打开本地终端,使用如下命令生成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 config --global user.name 'runoob'
$ git config --global user.email [email protected]
git config -l 查看当前git环境详细配置
初始化,生成.git文件(若该文件隐藏,则使用ls -ah)
git clone [远程仓库地址] #clone下来保持原文件夹名
git clone [远程仓库地址] [想要重命名的文件夹名称] #clone重命名的文件夹名称
添加多个文件到缓存区
git add [file1] [file2] ...
添加整个目录到缓存区
git add [dir]
添加全部到缓存区
git add .
git add -u . u指update,将工作区的被修改的文件和被删除的文件提交到暂存区,不包括新增的文件
提交暂存区到本地仓库中: 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加入暂存区。
创建新的分支,创建一个dev分支 :
git checkout -b dev
删除本地分支:
git branch -D dev
切换到dev分支:
git checkout dev
注意:由于检出命令会重置暂存区和工作区,因此,如果工作区或暂存区存在未提交的改动,切换将会失败,此时有两种选择。
git checkout . 放弃所有修改文件
git checkout – filename 放弃指定文件
还有另一种丢弃改动的做法是使用 -f 参数进行强制切换,即执行git checkout -f 忽略工作区和暂存区的改动强制进行切换,然后再使用git clean -dxf清理新增文件和文件夹。
本地创建的分支由于未设置上游追踪分支,因此,首次将新分支推送到远程时,不能直接使用git push命令,而应该使用git push 命令,明确指定要推送的的远程仓库和远程分支名。分支推送过一次远程之后,就会和远程建立追踪关系,下次推送就可以直接使用git push命令了。
切换远程分支
需要先将远程分支与本地分支关联
git checkout -b 本地分支名 origin/远程分支名
该命令可以将远程仓库里指定的分支拉取到本地,并在本地创建一个分支与指定远程仓库分支关联起来。并切换到新建的本地分支中。
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 push
将文件添加到远程仓库
git push -f
强制提交,当我们本地reset到旧的版本时,然后普通push会被拦截,因为此是本地HEAD指向比远程库还要旧
git push origin [branch-name]
推送当前本地分支到指定远程分支
push指定的提交commit
$ git push :
远程仓库名,默认为origin
提交的唯一码
远程分支名git status [file-name] 查看指定文件状态
git status 查看所有文件状态
显示所有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 查看分叉历史,包括:提交历史、各个分支的指向以及项目的分支分叉情况。
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
git clean -df 加-d是指包含目录,加-f是指强制,删除所有未跟踪的文件
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、和工作区修改,本地的源码也会变为上一个版本的内容(危险)
git revert -n [commit-id]
git revert -n HEAD^^
git switch -c [branch-name]
创建新分支并切换到该分支
git switch [branch-name]
切换到已有分支
git merge [branch-name]
用于合并指定分支到当前分支
git merge --quit
退出当前分支合并,当合并后冲突很多,要撤回合并分支就可以用这个命令
git remote add origin
远程地址 关联远程仓库
git remote
查看本地添加了哪些远程分支地址
git remote -v
查看本地添加了哪些远程分支地址更详细信息
git remote remove origin
删除本地指定的远程地址
git remote update origin
更新远端分支
git stash
隐藏当前工作的修改
如果不隐藏自己修改的半成品代码,就会发生切换到别的分支后,将然后自己的半成品代码带入其他分支,这样就发生很多不必要的麻烦。
git stash save message
执行存储时,添加备注,方便查找,只有git stash 也要可以的,但查找时不方便识别。
git stash list
查看隐藏的工作信息列表
git stash drop
删除隐藏的工作信息
git stash pop
恢复隐藏的工作信息,同时删除隐藏的工作信息
git stash apply [stash@{0}]
恢复指定的隐藏工作信息,但是不会删除隐藏的工作信息
添加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名
展示这次都修改了哪些文件
git show --name-only <commit_sha1>
对于多分支的代码库,将代码从一个分支转移到另一个分支是常见需求。
这时分两种情况。
$ 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 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闯关小游戏