实际开发中常用的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",然后就保存退出了。

② 《Git 修改已提交的commit注释

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 --continue

5)至此,就修改完毕了,然后就重新执行一次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教程

W3Cschool | Git教程

菜鸟教程 | Git教程

Git 大全

git中submodule子模块的添加、使用和删除

以上是关于实际开发中常用的Git操作的主要内容,如果未能解决你的问题,请参考以下文章

实际开发中常用的Git操作

Git的常见操作

痞子衡嵌入式:第一本Git命令教程- 转移(add/rm/mv)

Git工程开发实践——Git常用操作

Git常用的操作

整理项目开发中git几种常用的操作方式