前言
作为一个程序员,你保存代码的方式是什么?更新代码的方式是什么?你还在用拷贝的方式保存代码吗?U盘?移动硬盘?还是网盘?
正文
以上的一些方式你可能在刚开始学习或工作的时候会用到,但不是长久之计,因此你需要学会使用git。git的用法虽然不难,但是精通不易,如果不是经常使用,容易看了就忘记,特别是一些指令的使用,这里做一个记录,从头开始了解git。
一、安装Git
点击Git进入官网。
官网会根据你的电脑系统为你推荐最新的Git版本,这里你会看到2.37.0,Windows安装版本,点击Download for Windows进入下载页面。
点击下载符合你电脑的.exe程序,我是windows11,我下载的是64-bit Git for Windows Setup,下载过程慢慢等待即可。下载好之后双击exe进行安装,安装过程没啥好说的,前面一顿点击Next,碰到Install点击即可。安装完成之后我们在Android Studio中配置Git。
点击Android Studio导航栏File → Settings → Version Control → Git ,然后点击文件夹图标选择Git安装路径下的git.exe,之后点击Test,会出现你所安装的Git的版本,表明你安装的Git没有问题,配置完成。
二、准备工作
为了方便演示,我们通过Android Studio创建一个项目来进行git的了解,创建一个名为GitStudy的项目。
创建好之后就可以开始提交代码了,我们需要确认提交代码的平台,目前最火热的当然是GitHub(有时候访问不了,可能需要翻墙),然后是Gitee(码云,稳定)、GitLab。
GitHub
Gitee
GitLab
你要在那个代码托管平台保存自己的代码就去那个平台注册账号。
作为开源爱好者,我选择的是GitHub,账号注册这些环节就没有啥好说的,下面要做的就是把代码提交的GitHub上。那么我们可以在Android Studio中配置我们的Git账号,点击导航栏File → Settings → Version Control → GitHub。
点击Add account进行账号添加,会出现一个弹窗。
这里我们选择使用使用Token进行登录,点击 Log In with Token…,会出现一个弹窗。
这里我们需要输入Token,点击右侧的**Generate…**按钮去GitHub中构建Token。
这里需要你验证一下,输入密码之后点击Confrim password。身份验证通过之后进入Token创建页面。
这里Token的有效期是30天,你可以设置时间更长,其他的地方不用设置,滑动到页面底部。
点击Generate token按钮,Token的创建好了。
点击右侧的复制按钮,将Token复制一下,然后再回到Android Studio中,将token粘贴到输入框中。
点击Add Account即可完成GitHub账户添加,添加后就能看到账户的信息。
点击弹窗右下角的Apply进行账户应用,此时右上角的Reset就会消失,再点击OK关闭弹窗。
三、旅行开始
首先看一下我的GitHub主页。
现在是91个代码仓库,下面我们来提交第92个。首先我们在GitHub上创建一个新的仓库。
这里输入仓库的名称和描述,勾选Add a README file,这会在创建仓库的时候添加一个README.md文件,这个仓库默认是public公有的,表示任何人都可以看到,private则是私有的,仅自己和仓库成员可见。然后我们滑动到页面底部,点击Create repository 按钮,完成仓库的创建。
仓库创建成功,现在里面就只有一个md文件,下面我们要将自己的项目代码提交到这个仓库中。
回到我们刚才创建的项目,点击Android Studio底部导航栏的Terminal。
会自动进入当前项目的所在目录。
要提交代码首先需要创建一个本地代码仓库,有这个仓库才能去提交代码。
① git init
git init
在输入前我们先看一下当前项目的文件夹。
下面在Terminal中输入git init 然后回车,如下图所示。
初始化一个空的git仓库,此时你会发现你的项目的文件夹下多了一个.git文件夹。
它是一个隐藏文件,如果看不到,就需要设置一下查看方式。
② git add .
然后我们需要将所有的文件拷贝到暂存区。
git add .
通过这个命令就可以提交当前目录下所有的文件,注意这个命令后面有一个点,不要省略空格。在Terminal中输入git add .然后回车,如下图所示。
这里就是把所有的文件添加到git中,你会发现你的MainActivity.kt这个文件名的颜色变成了绿色,这也是一个小细节,如果你看到的是红色,那么你在重新打开一下看看,就会变成绿色,有时候Android Studio的检查机制没有那么及时。
③ git commit
文件添加到暂存区之后,我们就可以将暂存区内容添加到本地仓库中。
git commit -m "第一次提交"
这个命令稍微有一些长,在 Git 中,每次提交代码,都要写 Commit message(提交说明),否则就不允许提交。上面代码的-m参数,就是用来指定 commit mesage 的。你得让别人之后你这一次提交的代码是什么意思,当然也方便你以后查询。
下面我们在Terminal中输入git commit -m "第一次提交"指令,然后回车,如下图所示。
失败了,为什么呢?因为在执行这一步时需要知道提交的人是谁,另外这个信息里面也告诉你该怎么做了。
我们需要输入这两条指令,一条设置邮箱,一条设置名称。
例如我的邮箱是lonelyholiday@qq.com,名称是llw。
④ git config
git config --global user.email "lonelyholiday@qq.com"
git config --global user.name "llw"
下面在Terminal中就可以这么输入,先输入第一条,然后回车。
再输入第二条,然后回车。
你会发现似乎没有什么变化,实际上变化是有的。怎么查看这个变化呢?
通过
git config --global user.email
和
git config --global user.name
这两条指令和之前的区别就是没有设置值,下面我们执行回车看一下有什么变化。
这个变化是很明显的,现在解决提交人的信息问题,我们继续执行之前的未完成的git commit指令。
你有没有觉得每一条命令都要一个一个的敲很麻烦,实际上你刚才敲过的指令可以通过键盘的上下键进行切换,试试看吧。
现在我切换回git commit -m “第一次提交”,再回车一次。
这一次执行成功了。
⑤ git remote
因为要提交到GitHub中创建GitStudy上,所以我们需要将本地仓库提交到远程仓库并关联。关联需要一个重要的内容那就是远程仓库的地址。
复制仓库地址之后需要通过一个命令去关联。
git remote add origin "https://github.com/lilongweidev/GitStudy.git"
这里的仓库地址请使用自己的,你用我的肯定是提交不上去的,在Terminal中输入指令,回车。似乎没有打印什么内容,但是指令已经生效了。
⑥ git push
最后推送上去
git push origin main
上面命令表示,将本地的main分支推送到origin主机的main分支。如果main不存在,则会被新建。这个main是从哪里来的呢?
推送之前要注意推送的分支是哪一个。在Terminal中下面执行命令,回车。
然后就报错了,这里的报错是因为分支不同。
⑦ git branch
通过命令来查看当前的分支,
git branch
在Terminal中输入指令回车,来看看有什么不同。
原来本地的分支默认是master,而GitHub上创建的分支默认是main。分支需要统一,所以将本地的master改成main。
git branch -m master main
在Terminal中执行这个命令,回车。然后再查看当前分支,确认有没有改成功。
这里改好了,那么我们再来push。
哦豁,又有问题!是不是很烦呢?这是连接重置,国内访问GitHub有时候会这样,再来一次,我的原则就是不服输。
人麻了,又报错了,这个错误还有一点不太一样,这个错误的根源在哪里呢?经过我的百度了解之后,预测是远程仓库里面的README.md文件导致的,我们这样提交代码,可能会导致它丢失。这个颜色的字体是警告,我们无视它,执行。
git push --force
再回车看看。
没想到吧,还是不行,为什么不行呢?百度上说是因为本地当前分支没有和远端的分支进行相关联。但是我之前明明关联了,那么这又是闹哪样呢? 难道是改了本地分支名的原因吗?
这里其实还有一句话,告诉我们需要关联的执行下面这一行指令。
git push --set-upstream origin main
试试呗。
还是没有什么用,现在是不是心态崩了呢?莫慌,再尝试别的方式。
⑧ git pull
刚才我们一直是提交,但是因为远程仓库里面有一个README.md导致本地库和远程库有差异,所以我们反向操作一下,先把远程库的内容拉取到本地,试试看。
git pull --rebase origin main
执行
拉取成功了,我们再提交看看。
git push origin main
妈耶,终于成功了!我们看看GitHub上,这个库有没有变化。
来人,奏乐,这不得庆祝一下吗?嗯?
现在代码提交成功了,那我们修改一下AndroidStudio中的代码,然后再提交一次看看,这也是我们下班关闭电脑前要做的事情,保存代码。例如我们刚才写的指令都写到README.md中,代码如下:
# GitStudy Git学习 git init git add . git commit -m "第一次提交" git config --global user.email git config --global user.name git remote add origin "https://github.com/lilongweidev/GitStudy.git" git push origin main git push --force git push --set-upstream origin main git branch git branch -m master main git pull --rebase origin main git push origin main
你看到这个README.md文件名称变成了蓝色,这说明文件有改动,提交的时候就会把这个改动提交上去。
这里只需要先后执行。
git add .
git commit -m "修改README.md"
git push origin main
既可,如图所示:
我们再看看GitHub上的变化。
这个文件提交上来了,有时候我们会去查询之前提交的内容。
⑨ git log
可以通过git log进行查询。
git log
在Terminal中执行,回车。
注意看,这里的修改记录是按时间排序的,最近的一次修改在最上面,也就是修改修改README.md。
如果要查询当前最新的commit呢?
⑩ git show
git show
执行回车
这里就是查看当前最新的commit,这个日志中带有 绿色 + 号的表示是本次提交中新增的内容,我们滑动到最底下,你会看到光标没有结束,回车一下。
这里会看到我们的提交内容,你注意看,@@ -1,2 +1,29 @@表示之前是第1行到第2行,现在是到第29行。你就一直回车,直到看到End。
如果不需要查看了。
点击左上角的关闭按钮,关闭Local窗口。
有时候有这种情况,我们提交了一个commit之后发现好像还漏掉了什么内容,比如请求动态权限时忘记在AndroidManifest.xml中注册静态权限了,这时候我们需要将之前的commit改成本次的commit。也就是合并commit,我们来演示一下。修改一下MainActivity中的代码,如下所示:
class MainActivity : AppCompatActivity() { private val requestCamera = registerForActivityResult(ActivityResultContracts.RequestPermission()) { Toast.makeText(this, if (it) "权限授予" else "未授予", Toast.LENGTH_SHORT).show() } override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) requestCamera.launch(Manifest.permission.CAMERA) } }
这里的代码很简单,就是动态权限的申请。这种运行起来肯定是不会请求权限的,因为你没有注册静态权限,所以连那个询问用户权限是否开启的弹窗都不会出现,但是我们现在需要提交了。
这时候我们发现没有注册静态权限。现在去AndroidManifest.xml中注册静态权限。
<uses-permission android:name="android.permission.CAMERA"/>
⑪ git commit --amend
执行
git add .
git commit --amend -m "添加静态权限。"
然后推送上去。
再查看commit日志。
这样就避免出现两次commit了。
有时候我们开发项目,会有多个环境的项目,例如正式版,测试版,通常用不同的分支进行管理,现在我们只有一个main分支,那么我们可以通过命令去创建分支。首先我们会用到创建分支的指令。
git branch develop
这里的develop就是我们要创建的分支名称,意思是开发,下面执行一下,然后再查看分支。
可以看到这里有两个分支了,你会发现main分支前面有一个*号,同时是绿色的,这表示当前分支。
⑫ git checkout
那么如果要让develop变成当前分支呢?
执行
git checkout develop
然后我们再查看所有分支。
切换成功了,不过develop分支还没有内容的,为了让develop和main分支的内容不一样,我们com.llw.gitstudy包下创建一个ToastUtils.kt文件。
然后你会看到弹出一个窗口。
就是在询问你,是否要将此文件添加到git上,你会发现此时文件名是红色,当你点击了Add按钮就会变成绿色,如果你不希望每次创建文件时都询问你,就选中弹窗左下角的Don‘t ask again即可,现在我们点击Add。
然后我们在ToastUtils中写入如下代码:
import android.content.Context import android.widget.Toast fun String.showToast(context: Context) = Toast.makeText(context, this, Toast.LENGTH_SHORT).show() fun String.showLongToast(context: Context) = Toast.makeText(context, this, Toast.LENGTH_LONG).show()
然后我们在MainActivity中使用它。
private val requestCamera = registerForActivityResult(ActivityResultContracts.RequestPermission()) { if (it) "权限授予" else "未授予".showToast(this) }
下面我们将刚才所写的代码提交,还记得是什么指令吗?
最后我们推送当前的develop到服务器上,推送的时候可能会出现。
这样的异常,没事的,多试几次,总能推送上去,实在不行就更换网络再尝试。
这里我们就推送上去了,可以看到当服务器上没有这个分支的时候就会创建这个分支,下面我们去GitHub上看看。
分支提交成功。现在服务器加上本地就有四个分支了,我们可以通过命令查看一下。
执行
git branch -a
-a就是-all,表示全部。红色的就是服务器上的分支,四个分支没错。
现在develop分支代码和main分支不一致,当我们在develop分支中验证代码没有问题之后,将它合并到main分支中,首先要切换分支到main。
git checkout main
切换成功,下面进行合并
⑬ git merge
git merge --no-ff develop
–no-ff 在这的作用是禁止快进式合并。
然后打开GitHub,切换到develop分支,你会看到
点击Contribute会出现一个弹窗。
点击左边的Compare表示比较代码,点击右边的Open pull request表示同意这一次的分支请求,因为我已经知道我在develop中添加了什么内容,因此就无需比较了,直接点击右边Open pull request 。
添加描述后点击Create pull request按钮。
由于之前操作过快,忘记截图了,所以这里我回退了一下,重新搞了一次,上面的Test不重要,你注意下面这个Merge pull request按钮,点击它。
再点击Confirm merge。
最后写入描述,然后点击Comment按钮,然后你观察main分支中,就会发现那里有了之前没有的ToastUtils。
那么现在develop分支就没有什么用了,因此我们可以删除这个分支。
git branch -d develop
我们在删除前查看一下分支,然后执行删除,删除后再查看一下:
-d表示删除标识,要删除的不能是当前显示分支,同时不能包含未合并的更改和未提交的推送。
现在远程仓库中还有两个分支,我们也可以将远程仓库的分支删除掉。
git push origin -d develop
执行之前查看所有分支,执行删除,删除之后再查看所有分支。
很多时候我们会参考别的的代码,框架。会先运行别人的源码看看效果,这里就需要用到克隆。
例如我可能自己的项目到当前电脑指定文件夹下,项目地址是:Android12Bluetooth
点击Code按钮。
点击复制按钮,然后我们进入一个指定目录。
克隆指令如下
⑭ git clone
git clone https://github.com/lilongweidev/Android12Bluetooth.git
进入PowerShell,先进入到指定文件夹下,然后克隆。
然后再看文件夹。
克隆成功。
四、结束
Git的使用需要经常使用才能印象深刻,关于git的使用网络上有很多很多,遇到问题解决的方法也有很多,遇到问题不要慌,要坚定自己能解决这个问题,加油奥里给!!!