版本控制系统
本地工作区 add 暂存区 commit(每一次commit都会产生一个新的版本) 本地仓库 push 远程仓库
git代码托管平台
1、第一次使用git的时候需要执行1-4步,否则直接跳到第五步。
执行 git config --global user.name [用户名,个人空间地址]
如 git config --global user.name zhangsan
2、执行 git config --global user.email [绑定的邮箱]
3、配置密钥对(公钥和私钥),执行ssh-keygen
, 一路回车,就会在c/users/[电脑用户名]/.ssh
目录下生成公钥和私钥,这两个文件千万不要动!!!
4、把公钥复制到线上,在个人设置安全设置里的SSH公钥的位置
5、如果是新创建一个仓库,就执行5-7步,否则直接跳到第八步。初始化一个本地仓库
在本地项目位置执行git init
,在目录里回多出一个默认隐藏的 .git 目录,这个目录不要动!!!
git仓库不能嵌套,一个本地仓库对应一个远程仓库
6、创建一个远程仓库
登录gitee,新建公开仓库,其他的选项都不要勾
7、关联本地仓库和远程仓库
git remote add origin [线上仓库的ssh地址]
如果在执行这句话的时候报错:fatal: remote origin already exists.
那么就执行 git remote rm origin
,再重新add
8、把本地代码添加到暂存区,git add -A git add .
9、把暂存区的代码提交到本地版本库 git commit -m '[说明这一次提交做的事情]'
10、把本地版本库推送到线上 git push origin master
,在第一次提交的时候需要输入 yes
git clone [仓库地址]
把线上仓库克隆到本地
git checkout -b [文件名]
建立并切换分支
在分支上有修改后
git add .
git commit -m '[说明]'
git push origin [对应文件名]
另外一个人要做的
更新代码
git pull origin [分支名]
git status
查看本地仓库状态
git log
查看提交日志,在commit关键字后面的随机字符串就是版本号
git reset --hard [commitHash]
回退到某个版本
git diff [文件名]
查看文件修改
git branch
查看分支
git branch -D [分支名]
删除本地分支
git push origin --delete [分支名]
删除远程分支
git checkout [分支名]
切换分支
如果你已经熟练掌握上面的内容,相信你已经可以胜任日常工作的需求了,但是在开发过程中,我们总能遇到这样那样的问题,仅仅使用上面的方法并不能解决,那就需要更进阶版的git命令了
1、合并最新的更改到上一次更改的commit
git commit --amend
合并本次更改到上一次更改,并且修改commit内容
输入之后按I进入编辑,编辑完成后ESC 并输入 :wq保存
第一行的彩色文字就是需要修改的地方
git commit --amend --no-edit
合并本次更改到上一次更改,并且使用上一次的commit说明
2、合并任意两条或者多条commit
git log
查询commit记录,并复制需要修改的那条commit的前一条commitHash
git rebase -i [commitHash],
进入commit编辑模式pick
更改为squash
或者S
即可将当前commit合并到上方提交中pick
pick只是意味着包括提交。重新进行命令时,重新安排pick命令的顺序会更改提交的顺序。如果选择不包括提交,则应删除整行。
reword
该reword命令与相似pick,但是使用后,重新设置过程将暂停并为您提供更改提交消息的机会。提交所做的任何更改均不受影响。
edit
如果您选择edit提交,则将有机会修改提交,这意味着您可以完全添加或更改提交。您还可以进行更多提交,然后再继续进行变基。这使您可以将大型提交拆分为较小的提交,或者删除在提交中所做的错误更改。
squash
该命令使您可以将两个或多个提交合并为一个提交。提交被压缩到其上方的提交中。Git使您有机会编写描述这两个更改的新提交消息。
fixup
这类似于squash,但是要合并的提交已丢弃其消息。提交仅合并到其上方的提交中,并且较早提交的消息用于描述这两个更改。
exec
这使您可以对提交运行任意的Shell命令。
3、某一次的提交我不想要了,或者是我想更改信息
依然是git rebase -i
只是更改一下前缀、或者删除记录
从这上面的信息不难看出,git rebase -i
除了能合并提交之外,还能够编辑或者删除记录,操作完成之后同上ESC+:wq
保存退出就可
假如命令写错了,可按照提示输入git rebase --edit--todo
来重新编辑命令
这种情况下,可以使用暂时commit当前更改,然后切换分支来进行处理,我相信这也是大多数人的处理方式。
那么,难道就没有更好的方法了?其实是有的,这个方法就是
git stash
将当前未保存的更改保存至本地的堆栈中,按中文说法叫储藏;
使用git stash
之后使用git stash pop
可以将你最新的一条储藏的更改恢复
那么操作流程是:
1、git stash
储藏当前更改
2、进行你需要做的临时更改,并提交
3、使用git stash pop
将储藏的更改恢复,继续你的开发
当然,这只是简单方法,要想用的灵活就需要
1、使用git stash save [你要对此次更改进行的备注]
进行储存,区别是可以加上备注防止遗忘(因为可以储藏多条记录)
2、切换做其他的这个不说了
3、git stash list
查看已经保存的记录
4、git stash apply stash@{要恢复的序号}
恢复你想恢复的操作区进行后续操作
其余关于git stash
的命令
git stash drop + 名称
删除某指定stash
git stash clear
清除堆栈所有储藏记录
git stash show
查看最新的储藏记录和当前文件的差异
大多说情况下,我们可能会采用ctrl+c和ctrl+v的模式来进行这项操作,当然这样做也不是不行,但是如果是公共模块并且改动很多的情况下这样肯定不行。
这个时候,肯定有人想到了git pull
如果只是一个新提交,pull一下也行,但是如果是多个提交呢,而你只想要其中一个提交,这时候我们该怎么办呢?
这个时候我们就要用到一个新的命令git cherry-pick
git cherry-pick [commitHash/分支名]
就是将指定的提交(commit)或者分支应用于其他分支
Cherry pick 支持一次转移多个提交。(亲测试ok)
git cherry-pick
git cherry-pick A..B
转移从 A 到 B 的所有提交。它们必须按照正确的顺序放置:提交 A 必须早于提交 B,否则命令将失败,但不会报错。
注意,使用上面的命令,提交 A 将不会包含在 Cherry pick 中。如果要包含提交 A,可以使用下面的语法。
git cherry-pick A^..B
以上的操作冲突之后的操作方式大体上是一致的
(1)、–continue
用户解决代码冲突后,第一步将修改的文件重新加入暂存区(git add .),第二步使用下面的命令,让过程继续执行。
git rebase --continue
git cherry-pick --continue
(2)、–abort
发生代码冲突后,放弃合并,回到操作前的样子。
git rebase --abort
git cherry-pick --abort
(3)、–quit
发生代码冲突后,退出操作,但是不回到操作前的样子。(不及建议使用)
git rebase --quit
git cherry-pick --quit
我们通常在拉去其他分支代码的时候执行的是git pull
命令,这个操作其实是由两个命令构成的
git pull = git fetch + git merge FETCH_HEAD
假设当前master的提交如下:
如果是你或者你的同事在cid2点,开发进度是cid20(或者突然撇出一个分支,假设是tmp分支),此时要把cid20提交到master
在master执行git merge tmp,然后会得到如下结果:
新增了一次提交记录cid6, 似乎也没有什么问题。如果你装了git可视化工具,查看提交日志,会发现分支上有各种分叉,看起来很乱。
但是假如你使用git pull --rebase
命令来进行更新合并就会是另外一种现象。git pull --rebase
也是两个命令的合并
git pull --rebase = git fetch + git rebase FETCH_HEAD
可以看出这样不会有多余的分叉出现,从头到尾只有一条线
当然,这两种合并分支的方式各有优劣
git merge
直接合并两个分支,并产生分支合并的操作记录,会标明分支切入切出的源头
git rebase
変基合并分支,不会产生合并记录
如果是参与人员少,并且要记录所有的操作记录,建议直接merge
如果是参与人员多,方便各种版本管理,建议使用rebase
1、常用的Git命令
命令
简要说明
git add
添加至暂存区
git add–interactive
交互式添加
git apply
应用补丁
git am
应用邮件格式补丁
git annotate
同义词,等同于 git blame
git archive
文件归档打包
git bisect
二分查找
git blame
文件逐行追溯
git branch
分支管理
git cat-file
版本库对象研究工具
git checkout
检出到工作区、切换或创建分支
git cherry-pick
提交拣选
git citool
图形化提交,相当于 git gui 命令
git clean
清除工作区未跟踪文件
git clone
克隆版本库
git commit
提交
git config
查询和修改配置
git describe
通过里程碑直观地显示提交ID
git diff
差异比较
git difftool
调用图形化差异比较工具
git fetch
获取远程版本库的提交
git format-patch
创建邮件格式的补丁文件。参见 git am 命令
git grep
文件内容搜索定位工具
git gui
基于Tcl/Tk的图形化工具,侧重提交等操作
git help
帮助
git init
版本库初始化
git init-db*
同义词,等同于 git init
git log
显示提交日志
git merge
分支合并
git mergetool
图形化冲突解决
git mv
重命名
git pull
拉回远程版本库的提交
git push
推送至远程版本库
git rebase
分支变基
git rebase–interactive
交互式分支变基
git reflog
分支等引用变更记录管理
git remote
远程版本库管理
git repo-config*
同义词,等同于 git config
git reset
重置改变分支“游标”指向
git rev-parse
将各种引用表示法转换为哈希值等
git revert
反转提交
git rm
删除文件
git show
显示各种类型的对象
git stage*
同义词,等同于 git add
git stash
保存和恢复进度
git status
显示工作区文件状态
git tag
里程碑管理
2、对象库操作相关命令
命令
简要说明
git commit-tree
从树对象创建提交
git hash-object
从标准输入或文件计算哈希值或创建对象
git ls-files
显示工作区和暂存区文件
git ls-tree
显示树对象包含的文件
git mktag
读取标准输入创建一个里程碑对象
git mktree
读取标准输入创建一个树对象
git read-tree
读取树对象到暂存区
git update-index
工作区内容注册到暂存区及暂存区管理
git unpack-file
创建临时文件包含指定 blob 的内容
git write-tree
从暂存区创建一个树对象
3、引用操作相关命令
命令
简要说明
git check-ref-format
检查引用名称是否符合规范
git for-each-ref
引用迭代器,用于shell编程
git ls-remote
显示远程版本库的引用
git name-rev
将提交ID显示为友好名称
git peek-remote*
过时命令,请使用 git ls-remote
git rev-list
显示版本范围
git show-branch
显示分支列表及拓扑关系
git show-ref
显示本地引用
git symbolic-ref
显示或者设置符号引用
git update-ref
更新引用的指向
git verify-tag
校验 GPG 签名的Tag
4、版本库管理相关命令
命令
简要说明
git count-objects
显示松散对象的数量和磁盘占用
git filter-branch
版本库重构
git fsck
对象库完整性检查
git fsck-objects*
同义词,等同于 git fsck
git gc
版本库存储优化
git index-pack
从打包文件创建对应的索引文件
git lost-found*
过时,请使用 git fsck –lost-found 命令
git pack-objects
从标准输入读入对象ID,打包到文件
git pack-redundant
查找多余的 pack 文件
git pack-refs
将引用打包到 .git/packed-refs 文件中
git prune
从对象库删除过期对象
git prune-packed
将已经打包的松散对象删除
git relink
为本地版本库中相同的对象建立硬连接
git repack
将版本库未打包的松散对象打包
git show-index
读取包的索引文件,显示打包文件中的内容
git unpack-objects
从打包文件释放文件
git verify-pack
校验对象库打包文件
5、数据传输相关命令
命令
简要说明
git fetch-pack
执行 git fetch 或 git pull 命令时在本地执行此命令,用于从其他版本库获取缺失的对象
git receive-pack
执行 git push 命令时在远程执行的命令,用于接受推送的数据
git send-pack
执行 git push 命令时在本地执行的命令,用于向其他版本库推送数据
git upload-archive
执行 git archive –remote 命令基于远程版本库创建归档时,远程版本库执行此命令传送归档
git upload-pack
执行 git fetch 或 git pull 命令时在远程执行此命令,将对象打包、上传
6、邮件相关命令
命令
简要说明
git imap-send
将补丁通过 IMAP 发送
git mailinfo
从邮件导出提交说明和补丁
git mailsplit
将 mbox 或 Maildir 格式邮箱中邮件逐一提取为文件
git request-pull
创建包含提交间差异和执行PULL操作地址的信息
git send-email
发送邮件
7、协议相关命令
命令
简要说明
git daemon
实现Git协议
git http-backend
实现HTTP协议的CGI程序,支持智能HTTP协议
git instaweb
即时启动浏览器通过 gitweb 浏览当前版本库
git shell
受限制的shell,提供仅执行Git命令的SSH访问
git update-server-info
更新哑协议需要的辅助文件
git http-fetch
通过HTTP协议获取版本库
git http-push
通过HTTP/DAV协议推送
git remote-ext
由Git命令调用,通过外部命令提供扩展协议支持
git remote-fd
由Git命令调用,使用文件描述符作为协议接口
git remote-ftp
由Git命令调用,提供对FTP协议的支持
git remote-ftps
由Git命令调用,提供对FTPS协议的支持
git remote-http
由Git命令调用,提供对HTTP协议的支持
git remote-https
由Git命令调用,提供对HTTPS协议的支持
git remote-testgit
协议扩展示例脚本
8、版本库转换和交互相关命令
命令
简要说明
git archimport
导入Arch版本库到Git
git bundle
提交打包和解包,以便在不同版本库间传递
git cvsexportcommit
将Git的一个提交作为一个CVS检出
git cvsimport
导入CVS版本库到Git。或者使用 cvs2git
git cvsserver
Git的CVS协议模拟器,可供CVS命令访问Git版本库
git fast-export
将提交导出为 git-fast-import 格式
git fast-import
其他版本库迁移至Git的通用工具
git svn
Git 作为前端操作 Subversion
9、合并相关的辅助命令
命令
简要说明
git merge-base
供其他脚本调用,找到两个或多个提交最近的共同祖先
git merge-file
针对文件的两个不同版本执行三向文件合并
git merge-index
对index中的冲突文件调用指定的冲突解决工具
git merge-octopus
合并两个以上分支。参见 git merge 的octopus合并策略
git merge-one-file
由 git merge-index 调用的标准辅助程序
git merge-ours
合并使用本地版本,抛弃他人版本。参见 git merge 的ours合并策略
git merge-recursive
针对两个分支的三向合并。参见 git merge 的recursive合并策略
git merge-resolve
针对两个分支的三向合并。参见 git merge 的resolve合并策略
git merge-subtree
子树合并。参见 git merge 的 subtree 合并策略
git merge-tree
显式三向合并结果,不改变暂存区
git fmt-merge-msg
供执行合并操作的脚本调用,用于创建一个合并提交说明
git rerere
重用所记录的冲突解决方案
10、 杂项
命令
简要说明
git bisect–helper
由 git bisect 命令调用,确认二分查找进度
git check-attr
显示某个文件是否设置了某个属性
git checkout-index
从暂存区拷贝文件至工作区
git cherry
查找没有合并到上游的提交
git diff-files
比较暂存区和工作区,相当于 git diff –raw
git diff-index
比较暂存区和版本库,相当于 git diff –cached –raw
git diff-tree
比较两个树对象,相当于 git diff –raw A B
git difftool–helper
由 git difftool 命令调用,默认要使用的差异比较工具
git get-tar-commit-id
从 git archive 创建的 tar 包中提取提交ID
git gui–askpass
命令 git gui 的获取用户口令输入界面
git notes
提交评论管理
git patch-id
补丁过滤行号和空白字符后生成补丁唯一ID
git quiltimport
将Quilt补丁列表应用到当前分支
git replace
提交替换
git shortlog
对 git log 的汇总输出,适合于产品发布说明
git stripspace
删除空行,供其他脚本调用
git submodule
子模组管理
git tar-tree
过时命令,请使用 git archive
git var
显示 Git 环境变量
git web–browse
启动浏览器以查看目录或文件
git whatchanged
显示提交历史及每次提交的改动
git-mergetool–lib
包含于其他脚本中,提供合并/差异比较工具的选择和执行
git-parse-remote
包含于其他脚本中,提供操作远程版本库的函数
git-sh-setup
包含于其他脚本中,提供 shell 编程的函数库