赞
踩
每次提交代码都是提交到本地仓库,我们现在将本地仓库的代码推送至远程仓库,供所有人下载
远程仓库:一个远程仓库对应一个本地仓库,不会混乱
先学习下Git的几个工作区域:
Workspace
:电脑本地看到的文件和目录,在Git
的版本控制下,构成了工作区Index/Stage
:暂存区,一般存放在 .git
目录下,即.git/index
,它又叫待提交更新区,用于临时存放你未提交的改动。比如,你执行git add,这些改动就添加到这个区域Repository
:本地仓库,当执行git clone 地址
,就是把远程仓库克隆到本地仓库。它是一个存放在本地的版本库,其中HEAD
指向最新放入仓库的版本。当执行git commit
,文件改动就到本地仓库来了Git
初始化一个仓库时,Git
会在当前目录下创建一个名为.git
的隐藏文件夹来存储仓库的所有相关信息。这个.git
文件夹包含了版本历史、分支、标签、配置等信息,是 Git
本地仓库的核心部分Remote
:远程仓库,就是类似github,码云等网站所提供的仓库,可以理解为远程数据交换的仓库详情图
原理图:
git
的正向工作流程一般就这样:
根据一个文件是否已加入版本控制,可以把文件状态分为:Tracked
(已跟踪)和Untracked
(未跟踪),而tracked
(已跟踪)又包括三种工作状态:Unmodified
,Modified
,Staged
Untracked
: 文件还没有加入到git
库,还没参与版本控制,即未跟踪状态。这时候的文件,通过git add
状态,可以变为Staged
状态Unmodified
:文件已经加入git
库, 但是还没修改, 就是说版本库中的文件快照内容与文件夹中还完全一致。Unmodified
的文件如果被修改, 就会变为Modified
,如果使用git remove
移出版本库, 则成为Untracked
文件。Modified
:文件被修改了,就进入modified
状态啦,文件这个状态通过stage
命令可以进入staged
状态staged
:暂存状态. 执行git commit
则将修改同步到库中, 这时库中的文件和本地文件又变为一致, 文件为Unmodified
状态.在需要和远端交互的总文件夹内创建git仓库
,右键单击->选择Git Bash Here
git init
:创建git仓库,这会在项目根目录下生成一个隐藏的名为.git
的文件夹,这个文件夹存放的就是git仓库
通过ssh公钥
连接就需要ssh
的连接地址,比如:git@gitee.com:jingzh7751/git-test.git
ssh-keygen:
创建SSH密钥,在用户根目录下创建一个.ssh
文件夹, 里面包含了id_rsa
和id_rsa.pub
两个文件。 前者是私钥, 后者是公钥。秘钥不能泄露出去, 而公钥要设置在gitee相应位置
点击头像–设置—ssh公钥—填写内容—确定
git remote add test git@gitee.com:xx/xx.git:
会关联git@gitee.com:xx/xx.git
所对应的远程仓库。test
是设置的关联名字,可以随便起, 以后通过它向远程仓库提交程序
通过https
连接就需要https
的连接地址,比如:https://gitee.com/jingzh7751/git-test.git
此时就不需要ssh
生成公钥,也不用在gitee上配置ssh公钥
git remote add test https://gitee.com/jingzh7751/git-test.git:
用来和远端仓库进行关联,在拉取或者推送时只用输入账号或者密码就可以了
专用名词:
master
: 默认开发分支origin
: 默认远程版本库Index / Stage
:暂存区Workspace
:工作区Repository
:仓库区(或本地仓库)Remote
:远程仓库这个图只是模拟一下git基本命令使用的大概流程
git init
:在当前目录新建一个代码仓库
git init [project-name]
:新建一个目录,把它初始化为git代码仓库
git clone [url]
:下载一个项目和它整个代码的历史,即从远程把仓库复制一份到本地,克隆后会创建一个新的本地仓库
git checkout -b dev
: 创建开发分支dev,并切换到该分支下,-b
选项表示创建一个新的分支。具体来说是:切换到名为 dev
的分支,如果 dev
分支不存在,则创建一个名为 dev
的新分支
git config --list
:查看git配置
git config -e [--global]
:编辑git配置文件
git config [--global] user.name "用户名"
:设置[全局]配置用户名
git config [--global] user.password "密码"
:设置[全局]配置密码
git config [--global] user.email"邮箱"
:重新全局配置邮箱
ssh-keygen
:生成ssh 公钥
git status
:查看当前工作区的状态
git diff -- fileName
:命令可以查看工作区和版本库里面最新版本的区别
git add [file1] [file2]
: 添加文件到暂存区
git add dir
: 添加文件目录到暂存区
git add .
: 添加当前目录所有文件到暂存区
git add -p
: 添加每个变化前都会要求确认,对于同一文件多处变化,可以实现分次提交
git rm [file1] [file2]
: 删除工作区文件,并把删除放入暂存区
git rm --cached [file]
: 停止追踪指定文件,但该文件会保留在工作区
git mv [file-origname] [file-rename]
: 改名文件,并把改名放入暂存区
git commit -m [message]
:提交暂存区到本地仓库区
git commit [file1] [file2] ... -m [message]
:提交暂存区的指定文件本地仓库区
git commit -a
:提交工作区自上次commit之后的变化直接到本地仓库区
git commit -v
:提交时显示所有的diff信息
git commit --amend -m [message]
:使用一次新的commit,替代上一次提交,如果代码没有变化,就改写上一次commit的提交信息
git commit --amend [file1] [file2]
:重做上一次commit,并包括指定文件的新变化
git commit --amend --only -m 'xxxxxxx'
:如果提交信息(commit message)写错了且这次提交(commit)还没有推(push), 可以通过此方法来修改提交信息(commit message)
git commit --amend --author "New Authorname <authoremail@mydomain.com>"
:提交(commit)里的用户名和邮箱不对
git status
:显示有变更的文件
git log
:查看历史的每次提交信息,但是如果回退版本了,那么对应的历史信息就没了,那就使用git reflog
git reflog
:看到以前的每次执行动作
git log --stat
:显示commit历史,以及每次commit发生变更的文件
git log -S [keyword]
:根据关键字搜索提交历史
git log [tag] HEAD --pretty=format:%s
:显示某个commit之后所有变动,每个commit占据一行
git log [tag] HEAD --grep feature
:显示某个commit之后所有变动,其提交说明
必须符合搜索条件
git log --follow [file]
:显示某个文件版本历史,包括文件改名
git whatchanged [file]
:显示某个文件版本历史,包括文件改名
git log -p [file]
:显示指定文件相关的每一次的diff
git log -5 --pretty --online
:显示过去5次提交
git log --before="1 days"
:之前一天的版本提交
git shortlog -sn
:显示所有提交过的用户,按提交次数序排序
git blame [file]
:以列表方式查看指定文件的提交历史,显示指定文件是什么人在什么时候修改过
git show [commit]
:显示某次提交元数据和内容变化
git show --name-only [commit]
:显示某次提交发生变化的文件
git show [commit]:[fileName]
:显示某次时某个文件的内容
git remote
:查看关联的远程仓库的名称
git remote -v
:显示所有远程仓库
git remote add url
:添加一个远程仓库
git remote show [remote]
:显示某个远程仓库信息
git remote add [shortname] [url]
:增加一个新的远程仓库并命名
git fetch [remote]
:下载远程仓库所有变动
git fetch --all
:拉取所有远端的最新代码
git fetch origin master
:拉取远程最新master分支代码
git pull
:拉取远程仓库所有分支更新并合并到本地分支
git pull origin master
:将远程master分支合并到当前本地分支
git pull [remote] [branch]
:获取远程仓库变化,并与本地代码合并
git pull origin master:master
:将远程master
分支合并到当前本地master
分支,冒号
后面表示本地分支
git push [remote] [branch]
:上传本地指定分支到远程仓库
git push [remote] --force
:强行推当前分支到远程仓库,即使有冲突
git push [remote] --all
:推送所有分支到远程仓库
git push <remote> :<branch/tag-name>
:删除远程分支或标签
git push --tags
:上传所有标签
git push origin -d <branchname>
:删除远程branchname分支
git branch
:查看所有分支,当前分支前面会有一个*
表示
git branch -r
:列出所有远程分支
git branch -a
:列出所有本地分支和远程分支
git checkout -b [branch]
:创建并切换到新的分支
git checkout [branch]
:切换到指定分支,并更新工作区
git checkout -
:切换到上一个分支
git branch [branch-name]
:新建一个分支,但依然停留在当前分支
git branch --track [branch] [remote-branch]
:新建一个分支,与远程指定分支建立追踪关系
git branch --set-upstream [branch] [remote-branch]
:建立追踪关系,在现有分支与指定远程分支之间
git checkout -b [branch]
:创建并切换到新的分支
git branch -d [branch]
:删除分支
git push origin --delete [branch]
:删除远程分支
git branch -dr [remote/branch]
:删除远程分支
git merge [branch]
:用来合并指定分支到当前分支,假如要合并dev到master,使用此命令时需要先使用checkout命令
切换到master分支
,然后将 dev分支
的修改合并到master分支
git merge --no-ff origin/dev
:在当前分支上合并远程分支dev
git merge --abort
:终止本次merge,并回到merge前的状态
git rebase [branch]
:衍合指定分支到当前分支
git cherry-pick [commit]
:合并部分commit,不像merge是合并全部commit,选择一个commit合并到当前分支
git diff
:显示暂存区和工作区差异
git diff --cache [file]
:显示暂存区和上一个文件的差异
git diff HEAD
:显示工作区和当前分支最新commit之间差异
git diff [first-branch] ... [second-branch]
:显示两次提交之间差异
git diff --shortstat "@{0 day ago}"
:显示今天写了多少行代码
Git
的撤销与回退,在日常工作中使用的比较频繁。比如我们想将某个修改后的文件撤销到上一个版本,或者想撤销某次多余的提交,都要用到git的撤销和回退操作。
代码在Git
的每个工作区域都是用哪些命令撤销或者回退的呢,如下图所示:
如果文件还在工作区,还没添加到暂存区,可以使用git checkout
撤销
git checkout [file]
:恢复暂存区指定文件到工作区
git checkout [commit] [file]
:恢复某个commit指定文件到暂存区和工作区
git checkout .
:恢复暂存区所有文件到工作区
git checkout HEAD <file>
:撤销指定的未提交文件的修改内容
git reset
的作用是修改HEAD
的位置,即将HEAD
指向的位置改变为之前存在的某个版本,为了更好地理解git reset
,我们来回顾一下,Git
的版本管理及HEAD
的理解
Git
的所有提交,会连成一条时间轴线,这就是分支。如果当前分支是master
,HEAD
指针一般指向当前分支,如下:
假设执行git reset
,回退到版本二之后,版本三不见了哦,如下:
使用模式
git reset [file]
:重置暂存区指定文件,与上一次commit保持一致,但工作区不变
git reset [commit]
:重置当前分支指针为指定commit,同时重置暂存区,但工作区不变
git reset --hard
:重置暂存区与工作区,与上一次commit保持一致
git reset --hard HEAD
:撤销工作目录中所有未提交文件的修改内容,这个操作是不可逆的,慎用
git reset --hard HEAD^
:把当前的版本回退到上一个版本,如果退到上上个版本只需把HEAD^
改成 HEAD^^
以此类推
git reset --hard HEAD~100
:回退到前100个版本
git reset HEAD --file
:回退暂存区里的某个文件,回退到当前版本工作区状态,即可以取消已经使用git add
命令暂存的文件
git reset --hard [commit]
:重置当前分支的HEAD为指定commit,同时重置暂存区和工作区,与指定commit一致
git reset --keep [commit]
:重置当前分支的HEAD为指定commit,但是保持暂存区和工作区不变
hard,mixed,soft
三个区别:
git reset –-soft目标版本号
:可以把版本库上的提交回退到暂存区,修改记录保留git reset –-mixed 目标版本号
:可以把版本库上的提交回退到工作区,修改记录保留git reset –-hard
:可以把版本库上的提交彻底回退,修改的记录全部revert
假如代码git add
到暂存区,并未commit
提交,可以这样回退,如下:
git reset HEAD file
:取消暂存git checkout file
:撤销修改假如代码已经git commit
了,但是还没有push
:
git log
:获取到想要回退的commit_id
git reset --hard commit_id
:想回到过去,回到过去的commit_id如果代码已经push
到远程仓库了,也可以使用reset
回滚
git log
git reset --hard commit_id
git push origin HEAD --force
与git reset
不同的是,revert
复制了那个想要回退到的历史版本,将它加在当前分支的最前端。
revert之前:
revert 之后:
当然,如果代码已经推送到远程的话,还可以考虑revert
回滚
git log
:得到你需要回退一次提交的commit id
git revert -n <commit_id>
:撤销指定的版本,撤销也会作为一次提交进行,新建一个commit,用来撤销指定commit,后者所有变化都被前者抵消,并且应用到当前分支是否删除对代码的修改 | 是否删除Commit提交记录 | 是否会新增Commit记录 | |
---|---|---|---|
Undo Commit | 不会 | 未Push会,已Push不会 | 不会 |
Revert Commit | 会 | 不会 | 会 |
Drop Commit | 会 | 未Push会,已Push不会 | 不会 |
如果代码修改完了,已经Commit
了,但是还未push
,然后发现还有地方需要修改,但是又不想增加一个新的Commit
记录。这时可以进行Undo Commit
,修改后再重新Commit
如果已经进行了Push
,线上的Commit
记录还是会存在的,简单来说,就是撤销了Commit
的这个动作。
详细解释下:
首先,对项目进行了代码修改,然后进行commit操作。
确认Commit之后(未进行Push),这时候分支用户什么都不要选都是默认才能看到已提交未Push 的记录
进行Undo Commit操作
执行后和未Commit之前完全一样。
会新建一个 Revert “xxx Commit”
的Commit
记录,该记录进行的操作是将xxx Commit
中对代码进行的修改全部撤销掉。
首先,对项目进行了代码修改,然后进行commit
操作。
Commit之后:
进行Revert Commit
执行成功后:
可以看到,新增了Commit 记录Revert “测试Revert Commit”
,该记录中将测试Revert Commit
中对代码进行的修改删除了。
未push
和已push
区别:
未push
的Commit
记录,会删除Commit
记录,同时Commit
中对代码进行的修改也会全部被删除已push
的Commit记录,区别在于线上的Commit
记录不会被删除修改代码,然后进行Commit
进行Drop Commit操作后,Commit 记录被删除,代码修改也被删除
已push的Commit记录
如果在idea中是因为merge后操作,这时代码在 commit
没有 push
,但是还不能使用Undo,Revert,Drop
,可以使用强制撤销操作
在
回退上个版本,使用 HEAD^
or HEAD~1
以此类推,HEAD~2
或HEAD^^
表示撤销最后两次提交;HEAD~3
或HEAD^^^
表示撤销最后三次提交;
注意
:Reset Type
Mixed
:是默认方式。只保留源码,会回退 commit 和 index
的信息;(常用)Soft
:回退到某个版本。只回退了 commit
的信息,之前写的代码还是保留的,不会恢复到 index file 一级。如果还要提交,直接 commit;Hard
:彻底回退,本地源码也会变成上一个版本内容,不保留之前 commit
的代码。(一般不使用)打tag
就是对发布的版本标注一个版本号,如果版本发布有问题,就把该版本拉取出来,修复bug,再合回去
git tag
:列出所有本地标签git show [tag]
:查看taggit tag <tagname>
:基于最新提交创建标签git tag [tag] [commit]
:新建一个tag在指定commitgit tag -d <tagname>
:删除指定标签git show [tag]
:查看标签信息git push origin :refs/tags/[tagName]
:删除远程标签git push [remote] [tag]
:提交指定taggit push [remote] --tags
:提交所有taggit checkout -b [branch] [tag]
:新建一个分支指向某个tagrebase
又称为衍合,是合并的另外一种选择。
假设有两个分支master和test
D---E test
/
A---B---C---F--- master
执行 git merge test
得到的结果
D--------E
/ \
A---B---C---F----G--- test, master
执行git rebase test
,得到的结果
A---B---D---E---C‘---F‘--- test, master
rebase
好处是: 获得更优雅的提交树,可以线性的看到每一次提交,并且没有增加提交节点。所以很多时候,看到有些伙伴都是这个命令拉代码:git pull --rebase
,就是因为想更优雅
假如当前开发分支的工作区有开发的东西,但是另一个分支也有需要急需开发的代码,如果直接切换到新的分支,那么当前分区的工作就白费了,如果先把代码提交啊,回头再接着写。但是这样的提交是不合理的,也没有任何实际意义的,因为代码并没有完成,提交的是不完整的功能
git
给提供了stash
功能,可以把当前工作区的内容进行快照
,等待以后恢复使用
stash
命令可用于临时保存和恢复修改
git stash
:把当前的工作隐藏起来 等以后恢复现场后继续工作git stash save "修改的信息"
:保存工作区git stash list
:显示保存的工作进度列表git stash pop stash@{num}
:恢复工作进度到工作区git stash show
:显示做了哪些改动git stash drop stash@{num}
:删除一条保存的工作进度,删除最近的一次stashgit stash clear
:删除所有缓存的stashgit stash apply
:恢复到工作区,但是恢复后,stash
内容并不删除,需要用git stash drop
来删除,用git stash pop
,恢复的同时把stash
内容也删了git archive
:生成一个可供发布的压缩包
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。