关于git使用,我们内部服务使用gitlab,相关使用教程就不再赘述了。 以下说的都是windows环境下使用,殊途同归。git官网
初始化
git init
我通常很少直接在本地初始化一个仓库,大家基本都是从远程clone,即便是创建新项目,在gitlab web页面也是直接选择创建新project,然后供大家拉取进行开发。现有项目路径下(空文件夹,也可以不空),命令行模式
执行 git init 就会创建一个.git文件夹子目录,表示当前目录以及纳入版本管理。
添加修改
git add
大多数情况下,用这个命令将文件添加到项目中用来追踪后续文件变化。
来自官网解释——将这个命令理解为“添加内容到下一次提交中”而不是“将一个文件添加到项目中”要更加合适。
举个例子(以下操作都在android studio中)
我先创建了一个test.txt的文件,studio就自动增加到版本控制中,此时随便编辑一下,查询状态如下,有一个文件待提交,有一个修改未在待提交,此时执行commit 只会提交创建文件的部分,不会提交编辑后的部分,可以在提交前执行一次
git add app/test.txt 然后执行提交就会提交修改后的部分,大多数情况下在项目中创建的文件都需要进行版本管理,极少数情况创建的本地文件不需要进行管理,但是在studio中创建的时候就自动添加进管理了,在commit前可以通过执行git reset HEAD 将刚创建的文件移出版本追踪(仅限于创建后未提交的文件)。
#git status
On branch localTest
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
new file: app/test.txt
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: app/test.txt
除了移出刚创建的文件版本,还可以通过编辑仓库内的.gitignore文件来添加需要忽略的文件或者文件夹,
以下是官方例子,举一反三能应付大多数情况了
# no .a files 所有.a结尾的文件不跟踪
*.a
# but do track lib.a, even though you're ignoring .a files above
# 忽略取反,我已经忽略的所有的.a文件,但是我希望跟踪lib.a文件可以单独添加
!lib.a
# only ignore the TODO file in the current directory, not subdir/TODO
#忽略当前目录下的TODO文件,但是不会忽略子目录中的TODO
/TODO
# ignore all files in the build/ directory 忽略build目录下所有文件
build/
# ignore doc/notes.txt, but not doc/server/arch.txt 忽略doc目录下的.txt文件但是不忽略子目录中的
doc/*.txt
# ignore all .pdf files in the doc/ directory 忽略doc目录下的所有.pdf文件包括子目录
doc/**/*.pdf
关于比较 git diff 我没用过命令,都是在studio 右键文件compare with branch丝滑得多。
提交更新
git commit -m "-m引号内的内容为本次提交的说明"
通过此命令提交在暂存区的修改,还可以通过添加-a 命令将已跟踪但未添加到暂存区的修改提交。
举个例子,我现在已经有了test.txt 文件,我修改内容为abc 此时,按正常流程,
我需要先 git add text.txt 再执行git commit -m "test2"才能成功提交,通过添加-a 标签,能省略add步骤
直接执行git commit -a -m "test2"成功提交刚刚的修改
移除文件
git rm
同时删除本地文件并提交,studio下这个操作直接删除后提交完事,说个特殊的,我的test.txt 上一个版本添加到追踪的,但是这个版本我不想追踪它了,但是我本地还想继续用它,只是不再纳入版本控制,
执行命令git rm --cached text.txt 此时文件text.txt依旧在本地目录里不会被删除,同时下一次提交到仓库的修改行为变成删除文件text.txt
F:\AndroidStudioProjects\test>git rm --cached app/test.txt
rm 'app/test.txt'
F:\AndroidStudioProjects\test>git status
On branch localTest
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
deleted: app/test.txt
查看提交记录
这个不多说了,直接git log 输出密密麻麻看得烦,可以这样
git log --pretty=oneline -5 输出最近5次提交并且单行显示,爽多了
git log --stat -5 最近5次提交信息,并且带有简略信息,比如修改了哪些文件
git reflog 查看每次head变更时的日志(包括提交),已经删除的分支也能检测,可以用来恢复误删的分支节点
撤销操作
先说一种情况,比方说我修改了test.txt 创建了abc.txt文件,提交备注写成了“修复bug1”,但是我这次提交漏掉了abc,而且修复的是bug2,粗暴的做法是再提交一次修改完事,但是就会有两次提交记录。如果只希望有一次提交记录,并且修正备注,可以通过--amend命令按顺序做如下操作
git commit -m '修复bug2'
git add abc.txt
git commit --amend
完成后之前提交的记录就会被本次提交的记录覆盖,修正之前的提交。
已经修改但尚未提交时,撤销对某个文件的修改,studio没这么折腾,直接右键revert完事
git checkout -- test.txt
恢复成修改前的状态。
远程仓库相关
git remote -v 查看远程仓库简写(通常clone后自动创建的简写是origin)和地址
git remote add [remote-name] [url] 添加新的远程仓库
git remote set-url [remote-name] [url] 修改远程仓库地址
git fetch [remote-name] 拉取远程仓库信息但不会对当前工作进行合并
git pull [remote-name] 拉取数据后会尝试合并当前分支
git push [remote-name] [branch-name] 推送新分支到远程仓库
git remote rename [oldName] [newName] 修改远程仓库在本地的名称
git remote rm [remote-name] 移除远程仓库,只是移除本地与远程的关联,不是把远程服务器上的仓库给删除了。
标签相关
git tag 列出所有标签
git tag -a [tagname] -m "tag说明" 通常都是打附注标签
也可以对某次修改补打标签
git tag -a [tagname] -m "tag说明" [需要打标签的提交记录哈希值前6位]
git push origin [tagname] 推送标签到远程仓库
git tag -d [tagname] 删除本地仓库上的标签
git push [remote-name] :refs/tags/[tagname] 删除远程仓库的标签
git checkout [tagname] 单纯检出打标签时的文件版本,不做修改
git checkout -b [branch-name] [tagname] 检出打标签时的文件版本并创建新分支,用于修改后提交新版本
分支相关
git branch [branch-name] 创建新分支
git checkout [branch-name] 切换到指定分支
git branch -d [branch-name] 删除分支 studio右下角直接操作完成以上操作痛快
git branch -v 查看当前已有分支列表
git branch --merged 查看哪些分支已合并到当前分支
git branch --no-merged 查看哪些分支未合并到当前分支
git branch -u [oringin/branch-name] 修改当前分支跟踪的远程分支