实际开发中常用的Git操作
Posted Chin_style
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了实际开发中常用的Git操作相关的知识,希望对你有一定的参考价值。
git是用C语言开发的,以追求最高的性能。git自动完成垃圾回收,也可以用命令git gc --prune直接调用。
一,基础知识储备
1)集中式版本控制 — SVN
所有的版本数据都保存在服务器上,协同开发者从服务器上同步更新或上传自己的修改。
所有的版本数据都存在服务器上,用户的本地只有自己以前所同步的版本,如果不连网的话,用户就看不到历史版本,也无法切换版本验证问题,或在不同分支工作。而且,所有数据都保存在单一的服务器上,有很大的风险这个服务器会损坏,这样就会丢失所有的数据,当然可以定期备份。
2)分布式版本控制 — Git
每个人都拥有全部的代码!
所有版本信息仓库全部同步到本地的每个用户,这样就可以在本地查看所有版本历史,可以离线在本地提交,只需在连网时push到相应的服务器或其他用户那里。由于每个用户那里保存的都是所有的版本数据,只要有一个用户的设备没有问题就可以恢复所有的数据,但这增加了本地存储空间的占用。
不会因为服务器损坏或者网络问题,造成不能工作的情况!
Git是目前世界上最先进的分布式版本控制系统。
软件下载:git官网https://git-scm.com/
启动Git:文件夹内右键
Git Bash:Unix与Linux风格的命令行,使用最多,推荐最多;
Git GUI:图形界面的Git,不建议初学者使用,尽量先熟悉常用命令。
3)常用的Linux命令
1)、cd : 改变目录。
2)、cd . . 回退到上一个目录,直接cd进入默认目录
3)、pwd : 显示当前所在的目录路径。
4)、ls(ll): 都是列出当前目录中的所有文件,只不过ll(两个ll)列出的内容更为详细。
5)、touch : 新建一个文件 如 touch index.js 就会在当前目录下新建一个index.js文件。
6)、rm: 删除一个文件, rm index.js 就会把index.js文件删除。
7)、mkdir: 新建一个目录,就是新建一个文件夹。
8)、rm -r : 删除一个文件夹, rm -r src 删除src目录
rm -rf / 切勿在Linux中尝试!删除电脑中全部文件!
9)、mv 移动文件, mv index.html src index.html 是我们要移动的文件, src 是目标文件夹,当然, 这样写,必须保证文件和目标文件夹在同一目录下。
10)、reset 重新初始化终端/清屏。
11)、clear 清屏。
12)、history 查看命令历史。
13)、help 帮助。
14)、exit 退出。
15)、#表示注释
4)工作区域
Git本地有三个工作区域:工作目录(Working Directory)、暂存区(Stage/Index)、资源库(Repository或Git Directory)。如果在加上远程的git仓库(Remote Directory)就可以分为四个工作区域。文件在这四个区域之间的转换关系如下:
- Workspace:工作区,就是你平时存放项目代码的地方;
- Index / Stage:暂存区,用于临时存放你的改动,事实上它只是一个文件,保存即将提交到文件列表信息;
- Repository:仓库区(或本地仓库),就是安全存放数据的位置,这里面有你提交到所有版本的数据。其中HEAD指向最新放入仓库的版本;
- Remote:远程仓库,托管代码的服务器,可以简单的认为是你项目组中的一台电脑用于远程数据交换。
日常使用要记住上图6个命令 + review操作:
- git clone - 克隆
- git checkout - 检出
- git add - 增加
- git commit - 提交
- git push - 推送
- git pull --rebase - 拉取
- git review branch_name - review
团队内会有一位Code reviewer,负责代码管理的,团队成员一般执行完git commit之后,不会自己手动执行git push,而是执行git review,而后有reviewer检验完代码后,进行git push。
4.1 本地仓库搭建
# 在当前目录新建一个Git代码库
$ git init
执行后可以看到,仅仅在项目目录多出了一个.git目录,关于版本等的所有信息都在这个目录里面。
4.2 克隆远程仓库
# 克隆一个项目和它的整个代码历史(版本信息)
$ git clone [url] # https://gitee.com/kuangstudy/openclass.git
克隆远程目录,将远程服务器上的仓库完全克隆一份至本地!
二,上命令
仓库
# 在当前目录新建一个Git代码库
$ git init# 下载一个项目和它的整个代码历史
$ git clone [url]
查看信息
# 显示当前分支的版本历史
$ git log# 显示commit历史,以及每次commit发生变更的文件
$ git log --stat# 显示有变更的文件
$ git status
增加/删除文件
# 添加指定文件到暂存区
$ git add [file1] [file2] ...# 添加指定目录到暂存区,包括子目录
$ git add [dir]# 添加当前目录的所有文件到暂存区
$ git add .
代码提交
# 将指定的提交(commit)应用于其他分支。
$ git cherry-pick
对于多分支的代码库,将代码从一个分支转移到另一个分支是常见需求。
这时分两种情况。一种情况是,你需要另一个分支的所有代码变动,那么就采用合并(git merge)。另一种情况是,你只需要部分代码变动(某几个提交),这时可以采用 Cherry pick。
# 提交暂存区到仓库区
$ git commit -m [message]# 使用一次新的commit,替代上一次提交
# 如果代码没有任何新变化,则用来改写上一次commit的提交信息
$ git commit --amend -m [message]# 重做上一次commit,并包括指定文件的新变化
$ git commit --amend [file1] [file2] ...# 修改的是更前面commit记录的注释信息,以2次为例
$ git rebase -i HEAD~2# 提交至gerrit,进行代码review
$ git review [branchname] && git review -R -y [branchname]
① 注意 git commit --amend -m[message]
可以快速修改上一次的commit信息,但是只能使用一次,如果需要再次修改,则要执行 git commit --amend,进入Vim编辑界面:
英文输入"i",进入编辑模式,然后修改提交记录;
修改完之后,按Esc,接着输入":wq",然后就保存退出了。
1)输入:git rebase -i HEAD~2
最后的数字2指的是显示到倒数第几次 比如这个输入的2就会显示倒数的两次注释;此时会进入VIM编辑界面,如下图所示。
2)你想修改哪条注释 就把哪条注释前面的pick换成edit。方法就是上面说的编辑方式:i---编辑,把pick换成edit---Esc---:wq. (这一步不是直接修改提交信息,而是标记需要修改的信息)3)然后输入下面的修改命令,重新进入VIM编辑界面,此时就可以修改上面标记过的信息:
git commit --amend ,然后i, 编辑信息,编辑完Esc+:wq保存退出。4)修改注释,保存并退出后,输入:
git rebase --continue5)至此,就修改完毕了,然后就重新执行一次review
git review xpdev
③ 注意 git review
—— 提交commit之后,需要review,只有review之后的代码才能被merge。
一次commit记录,生成一个change id,可以被review一次。
若是有多个提交记录,则需执行git review -R -y branchname
撤销
# 重置当前分支的指针为指定commit,同时重置暂存区,但工作区不变
$ git reset [commitID]暂时将未提交的变化移除,稍后再移入
$ git stash
$ git stash pop
有时commit之后,发现需要撤销,就可以执行git reset commitid,回到某次历史提交。
在一个分支内修改了文件,此时需要切换到另一分支时,就可以先执行git stash,保存起来。
当然也可以使用android Studio自带的操作,效果是一样的:
远程同步
# 显示所有远程仓库
$ git remote -v# 显示某个远程仓库的信息
$ git remote show [remote]# 拉取远程代码
$ git pull --rebase
- git pull = git fetch + git merge FETCH_HEAD
- git pull --rebase = git fetch + git rebase FETCH_HEAD
子模块
某个工作中的项目需要包含并使用另一个项目。 也许是第三方库,或者你独立开发的,用于多个父项目的库。 现在问题来了:你想要把它们当做两个独立的项目,同时又想在一个项目中使用另一个。
Git 通过子模块来解决这个问题。 子模块允许你将一个 Git 仓库作为另一个 Git 仓库的子目录。 它能让你将另一个仓库克隆到自己的项目中,同时还保持提交的独立。
git submodule init
git submodule sync
git submodule update
克隆项目后,默认子模块目录下无任何内容。需要在项目根目录执行如下命令完成子模块的下载:
分支
# 列出所有本地分支
$ git branch# 列出所有远程分支
$ git branch -r# 列出所有本地分支和远程分支
$ git branch -a# 切换到指定分支,并更新工作区
$ git checkout [branch-name]# 删除分支
$ git branch -d [branch-name]# 删除远程分支
$ git push origin --delete [branch-name]
$ git branch -dr [remote/branch]
删除本地分支:切换到其他分支,然后AS中选择Delete就行。
删除远程分支:git push origin --delete dev20181018
标签
# 列出所有tag
$ git tag# 查看tag信息
$ git show [tag]
其他
# 打开历史记录的图形化查看器
$ gitk
在安装 Git 的同时,你也装好了它提供的可视化工具,gitk 和 git-gui。
gitk 是一个历史记录的图形化查看器,你可以把它当作是基于 git log 和 git grep 命令的一个强大的图形操作界面,当你需要查找过去发生的某次记录,或是可视化查看项目历史的时候,你将会用到这个工具。
每个点代表一次提交,线代表父子关系,而彩色的方块则用来标示一个个引用。 黄点表示 HEAD,红点表示尚未提交的本地变动。
三,Sourcetree操作
Sourcetree是一个用于Windows和Mac的免费Git客户端。
Sourcetree简化了如何与Git存储库进行交互,这样就可以集中精力编写代码。
官网下载地址:Sourcetree | Free Git GUI for Mac and Windows
上面所有的命令行都可以通过客户端的形式进行操作,很直观。
上面的2个修改commit信息的git命令行可以修改commit的注释信息,但是无法修改提交的文件。比如说要是一次commit之后,然后git review时发现有一些代码细节需要优化,一点点修改,不值得再进行一次commit,所以就可以利用sourcetree的这个功能,把这一点代码完善之后,然后选择“修改最后一次提交”
然后再接下来的弹窗内选择使用上一次提交记录,这样就会把该次提交合并到上次修改当中,注意这里的是“合并”策略,而不是“覆盖”策略。
这个操作是很有价值的。
参考:
以上是关于实际开发中常用的Git操作的主要内容,如果未能解决你的问题,请参考以下文章