简介
我们都知道,代码版本管理工具常用的有SVN和Git,如果你两个工具都用过,就会发现Git比SVN实在是好用太多了。Git既可以作为AndroidStudio的插件绑定使用,也有自己的客户端界面操作,还可以使用命令去管理代码。作为AndroidStudio的插件使用时,个人觉得最大的优点是解决冲突特别方便,当然更新提交等其他操作也很方便,修改的代码都一目了然。但是作为一个程序员,我们还是有必要熟悉Git的一些常用的命令,快速解决一些代码管理的问题。
我们可以把Git大致分为以下几个区域
- 工作区
- 暂缓区
- 本地仓库
- 远程仓库
常用命令使用和总结
对某个文件夹进行git版本管理,例如D:\gitproject\hxx
在需要管理的项目文件夹下,右键选择"git bash here"
或
在任意位置右键选择"git bash here",然后通过命令切换文件夹
$ cd D: //切换到目标磁盘
$ cd gitproject/hxx //再切换到目标文件夹下
配置个人用户名和电子邮件,即需要关联的远程仓库的用户名和电子邮件。后面更新、提交代码等操作都是基于次账号。
有"--global"代表本机所有项目git版本管理通用这个用户信息配置;没有"--global"代表只有当前项目使用这个用户信息配置。
$ git config --global user.name "hxx"
$ git config --global user.email "hxx@163.com"
或
$ git config user.name "hxx"
$ git config user.email "hxx@163.com"
若项目是通过http url操作,每次
都需要用户输入用户名和密码,解决办法是第一次clone、pull或push代码时,执行一个命令行,记住密码。
$ git config --global credential.helper store
查看所有的配置
$ git config --list
结果
core.symlinks=false
core.autocrlf=true
core.fscache=true
color.diff=auto
color.status=auto
color.branch=auto
color.interactive=true
help.format=html
rebase.autosquash=true
http.sslbackend=openssl
http.sslcainfo=D:/ProgramFile/Git/mingw64/ssl/certs/ca-bundle.crt
credential.helper=manager
user.name=hxx
user.email=hxx@163.com
...
把当前目录变成git本地仓库(创建本地仓库),目录下会多一个.git目录,以后在这个文件目录下写代码Git就能跟踪到变化了
$ git init
查看本地仓库文件的状态,会返回本地仓库的有哪些文件改变了,哪些文件没提交,哪些文件没有追踪到等信息,还会给出下一步操可能需要操作命令的提示。
建议每次对仓库进行操作之前,查看下状态,避免误操作。
$ git status
将本地仓库目录下新创建的某个文件,添加到本地暂存区,例如readme.txt文件
$ git add readme.txt
将本地仓库目录下所有新建的文件都添加到本地暂存区,"."代表所有文件及文件夹,"a"代表"all"
$ git add .
注意:当代码合并后有冲突,文件爆红,根据报错的位置手动解决冲突后,执行$ git add .命令即可恢复绿色,然后按正常流程操作即可
或者
$ git add -a
将本地缓存区的指定文件提交到本地仓库,没有任何提示说明提交成功
$ git commit -m readme.txt
将本地缓存区的所有文件提交到本地仓库,tag是本次的提交说明
$ git commit -m 'tag'
将新建的文件添加到本地缓存区,并提交到本地仓库,
$ git commit -am 'tag'
//相当于下面2行命令的效果
$ git add -a
$ git commit -m 'tag'
如果提交代码后发现有部分错误,又不想git上增加提交记录,修改上一次提交,将两次提交合并为一次提交
git add .
git commit --amend
或修改提交的comment:
git commit --amend -m "提交tag"
如果上次代码已经提交到远程,但是还没有merge到主线,修改提交记录后,可以强制push到远程
git push --force
第一次将本地仓库的代码推到远程仓库的主分支上
$ git push -u origin master
第一次push到远程仓库时,手动输入"yes"需要确认
$ git push -u origin master
The authenticity of host '120.79.37.131 (110.87.97.xxx)' can't be established.
ECDSA key fingerprint is SHA256:xxG3+GGS9LO+cHz2XGDeqVAQ54rfGN1jNSf4U8YRxxx.
Are you sure you want to continue connecting (yes/no)? yes
$ yes
以后推代码,只需要输入下面的命令就可以,意思是将代码push到当前分支上
$ git push
在本地仓库创建新的分支(实际开发中,创建分支命名规则参考git分支命名规范)
$ git branch branchName
切换到指定的分支
$ git checkout branchName
在本地仓库创建新的分支,并切换到该分支上
$ git checkout –b branchName
本地先开好分支再推送到远程分支,远程分支不存在会自动创建
$ git push origin localBranchName:featureBranchName
远程先开好分支,然后拉到本地本
$ git checkout -b branchName origin/branchName
查看所有分支,当前分支前面会添加一个星号标记
$ git branch -a
合并某分支到当前分支,加入当前所在的是主分支(master),需要把另一个分支(branchName)的代码合并到当前分支
$ git merge branchName
发现你分支提交的代码与主分支代码有冲突,rebase代码,会直接修改git提交的代码,本地提交记录时间都更新成rebase的时间
1. 先保证本地的开发分支和master分支都是最新的code
2. 切换到你现在开发的分支并执行
git rebase master
3. 这样就会把你现在正在开发的分支中已经写好的代码与最新的master分支的代码合并在一起
4. 合并的过程中可能会涉及很多冲突需要解决。
输入 git status 显示冲突的文件,然后找到那个文件解决冲突。
解决完冲突后,输入git add [文件名] 或git add .
然后继续输入 git rebase --continue ,看结果提示rebase是否结束,没有就继续git status开始新一轮的冲突处理,直到所有的冲突全部解决
5:解决完冲突后,推送到远程库。
git push --force
6:rebase 完成
7.rebase操作一半,想把前面解决的所有冲突都会恢复到rebase前的状态,如何终止rebase操作?
git rebase --abort
删除本地指定的分支
$ git branch –d branchName
删除远程分支
$ git push origin : remoteBranch
或
$ git push origin --delete remoteBranch
或在github或gitlab等手动删除指定分支
删除远程分支后,本地需要与远程同步分支,有以下几种方式
1.在本地通过命令删除远程分支,同一个用户同步远程分支,使用命令如下,同步之后可以同步远程仓库分支的变化(新建、删除分支等变动),但只同步远程分支,不会拉代码
$ git fetch
如果需要同步分支并且拉代码到本地(将远程主机的master分支的代码拉到本地branchName分支上,但是没有合并代码),这行命令一般不单独用,配合merge一起使用,合并代码,效果和git pull一样。
$ git fetch origin master branchName
$ git merge branchName
2.如果是手动在github上删除远程分支或者其他用户删除的远程分支,使用上面的命令貌似不管用,这时有两种解决方法
$ git fetch -p
或
$ git remote show origin
$ git remote prune origin //git bash有提示
看截图
上面两种都可以完成同步远程分支,然后可以用git branch -a查看分支情况
将远程仓库的项目(假设远程仓库的git地址是:git@hxx/android-hxx.git),下载到本地仓库(本地什么都没有)。
先在本地新建一个放项目的文件夹,然后右键打开git bash(git命令框),输入命令行:
$ git clone git@hxx/android-hxx.git
查看git版本管理的日志,里面包含所有版本commit的记录。
$ git log
结果示例
commit 89e48b86a6007dd77c8d711be1645ggef1746e66 (HEAD -> master, origin/master)
Author: hxx <hxx@163.com>
Date: Tue Sep 17 17:27:06 2019 +0800
去掉多余import
commit 869ecd785df3e2tfe4a642bcbcb628dff092rr11
Author: hxx <hxx@163.com>
Date: Tue Sep 17 16:09:55 2019 +0800
Init hxx project
commit后面跟的一串字符,是commit的唯一Id。
注意:退出git log需要在英文输入状态下按Q键
git本地仓库版本回退
回退到上一个版本
不保留commit的代码
$ git reset --hard HEAD^
保留commit的代码
$ git reset --soft HEAD^
回退到上上个版本
不保留commit的代码
$ git reset --hard HEAD^^
保留commit的代码
$ git reset --soft HEAD^^
重点引入补充:撤销commit提交详细操作总结
查看git log,根据commit的唯一Id回退到指定版本(只是工作区的代码回退了,仓库的和远程的没变,需要commit和push)
不保留commit的代码
$ git reset --hard 869ecd785df3e2tfe4a642bcbcb628dff092rr11
保留commit的代码
$ git reset --soft 869ecd785df3e2tfe4a642bcbcb628dff092rr11
git add . 后如果有不想提交的文件,比如build文件夹,如何撤销操作
全部撤销:git reset HEAD
撤销某个文件:git reset HEAD filename
撤销某个文件夹:git reset HEAD dirfile
创建本地仓库和远程仓库后,我们还需要将本地仓库与远程仓库进行关联,才能本地和远程关联管理项目。
$ git remote add origin git@hxx/android-hxx.git
查看本地仓库关联的远程仓库
$ git remote -v
结果:
origin git@hxx/android-hxx.git (fetch)
origin git@hxx/android-hxx.git (push)
本地仓库关联另一个远程仓库。例如,我本地仓库目前只关联了git仓库,还想同时关联公司的gitlab平台的仓库
$ git remote add gitlab git@hxx/android-hxx.git
再次查看所关联的远程仓库
gitlab git@hxx/android-hxx.git (fetch)
gitlab git@hxx/android-hxx.git (push)
origin git@hxx/android-hxx.git (fetch)
origin git@hxx/android-hxx.git (push)
将远程仓库(主机名=origin,分支=master)的代码拉到本地仓库,并与当前分支合并
$ git pull origin master
当然,也可以指定与本地仓库的某个分支合并
$ git pull origin master branchName
暂存当前未开发完成的代码,很实用
当新功能的代码写到一半,甚至还有报错,突然线上有紧急bug需要修复,需要在其他分支上修改代码。这时由于当前分支代码变动但是未提交(功能不完整或者报错,最好不要直接提交代码),无法直接切换到目标分支,解决的办法就是
1.把代码暂时锁定在当前分支的本地缓存区
$ git stash
2.锁定完成后就可以切换到其他分支修改代码了,结束后随时再切回原来开发的分支(开发到一半的代码还看不到),然后解除代码本地锁定(开发到一半的代码可见了),继续未完成的代码开发
$ git stash pop
最后,再记录下在关联git之前,我们需要设置忽略文件,我的习惯是直接修改项目的gitignore文件,
项目最外层的.gitignore文件的配置(可以根据自己的需求配置)
*.iml
.gradle
.idea
/local.properties
/build
/debug
/release
.DS_Store
/captures
.externalNativeBuild
然后再关联git就可以了。
Git-LFS
根据电脑型号,下载对应的LFS,以intel的MAC笔记本为例,下载Mac - Intel Silicon版本的ZIP
提示:第1步执行./install.sh命令时,如果报错install: /usr/local/bin/git-lfs: Permission denied
说明没有修改/usr/local/bin目录的权限,请尝试修改它的访问权限
$ sudo chmod -R 777 /usr/local/bin/
如果无法修改,查看csrutil status,如果是enable,尝试关闭SIP【csrutil disable终端命令】
如果执行命令后,提示Git LFS initialized.说明git-lfs安装成功,
然后再执行git lfs install,提示Updated Git hooks.Git LFS initialized.说明成功了。
1. Setup Git LFS on your system. You only have to do this once per
repository per machine:
(在下载zip的解压后文件夹下找到install.sh,执行脚本即可:mac在当前文件夹下打开终端,输入./install.sh)安装后,只有执行一次以下命令
git lfs install
2. Choose the type of files you want to track, for examples all ISO
images, with git lfs track:
在本地项目目录下,过滤需要跟踪的大文件,可以是具体的文件名,也可以支持正则写法
git lfs track "*.iso"
3.查看有哪些文件加入跟踪,大文件是否加入lfs跟踪成功,没有再执行4
git lfs track
4. The above stores this information in gitattributes(5) files, so
that file need to be added to the repository:
手动将上面的过滤文件加入跟踪
git add .gitattributes
5. Commit, push and work with the files normally:
最后正常的执行和add,commit,push等操作就可以
git add file.iso
git commit -m "Add disk image"
git push