获取与创建项目
- 创建仓库的途径有:
- 在本地已有的目录,初始化一个新的;
- 克隆复制一份别人的项目。
git init
- 在当前目录下创建.git目录,同时当前目录成为一个Git仓库。
git clone
-
git clone Git仓库url
:将http或ssh链接指向的Git仓库拷贝到本地。 -
git clone Git仓库url 本地目录路径
:将远程Git仓库拷贝到本地指定目录。
添加与提交
基本流程
- 使用
git add
添加需要追踪的新文件和待提交的更改; - 使用
git status
和git diff
查看有何改动; - 使用
git commit
提交快照。
git add
-
git add 文件
:将文件添加到缓存区,该文件被标记为被追踪。 -
git add .
:缓存当前目录下所有文件,不包括已删除的文件。
- 注意,git add只是复制一份当前状态下的该文件到缓存区,该文件之后的修改若不重新git add,则提交的时候,只会将上次git add的缓存提交给仓库。
git commit
-
将缓存写入仓库中。
-
git add
是工作区->缓存区,git commit
是缓存区->仓库。 -
git commit -m "本次提交说明"
:一次性将缓存区所有文件修改提交到仓库的当前分支。 -
git commit -am "本次提交说明"
:自动把所有已经跟踪过的文件缓存,并提交到仓库。常用于跳过git add
步骤快速提交。 -
git commit --amend "本次提交说明"
:重新提交。此次提交代替上一次提交的结果。尤其适用于提交完了才发现漏掉了几个文件没有添加,或者提交信息写错了的情况。
git status
-
git status
:显示当前仓库的最新状态。 -
git status -s
:当前仓库的最新状态的简介。git status -s
- 状态值第一栏是关于缓存区的(绿色),第二栏是关于工作区的(红色)。
- ??表示该文件仅是本地文件。
- 绿色A表示该文件以前没被提交过,添加到缓存;(提交时会告知仓库添加此快照)。
- 绿色M表示该文件以前被提交过后,又添加到缓存;(提交时会告知仓库修改此快照)。
- 绿色D表示该文件以前被提交过后,被本地删除了,又删除缓存;(提交时会告知仓库删除此快照)。
- 绿色R表示该文件添加到快照时,系统发现某个D快照与其相同,并将D文件名改为该文件名。
- 红色M表示该文件被本地修改过。
- 红色D表示该文件被本地删除了。
- 状态值第一栏是关于缓存区的(绿色),第二栏是关于工作区的(红色)。
git diff
-
git diff
:比较工作区和缓存区的不同。 -
git diff --cached
:比较缓存区和仓库的不同。 -
git diff 文件
:比较指定文件在工作区和缓存区的不同。 -
git diff 文件 --cached
:比较指定文件在缓存区和仓库的不同。
-
git diff 提交版本号1 提交版本号2
:比较两次提交之间的区别。 -
git diff 分支1 分支2
:比较两个分支之间的区别。
- 注意:只会比较那些跟踪文件(即
git add
过的文件)。
git show
-
git show
:查看最后一个提交的内容。 -
git show HEAD~1
:查看倒数第二个提交的内容。 -
git show 提交版本号
:查看指定提交的内容。
删除与恢复
git rm
-
主要用于从版本库中删除文件。
-
git rm 文件
:把文件从版本库中删除,不再跟踪。 -
git rm log/\*.log
:将log目录下扩展名为.log的所有文件从版本库中删除,不再跟踪。通常适用于不小心把一些编译、日志、debug文件错误提交到版本库。
-
git rm -f 文件
:当文件有未提交的缓存区修改时,直接使用git rm 文件
会报错。此时执行此命令可强制将文件从缓存区和版本库中删除。
-
git rm --cached 文件
:把文件从版本库中删除,但让文件保留在工作区且不被Git继续跟踪。通常适用于rm文件之后把其添加到.gitignore中。
恢复
-
git checkout -- 文件
:丢弃工作区的修改。此文件必须是Git跟踪的。- 修改后仍未放到缓存区,恢复到上一次
git commit
的状态。 - 添加到缓存区后又做了修改,恢复到上一次
git add
的状态。
- 修改后仍未放到缓存区,恢复到上一次
-
git reset HEAD 文件
:丢弃缓存区的修改,回退到工作区。
-
git reset --hard
:重置所有文件到上次commit的状态。 -
git reset --hard HEAD~1
:将当前分支重置为倒数第2个版本。 -
git reset --hard 提交版本号
:将当前分支重置为指定版本。
版本控制
版本号
-
Git的版本号是SHA1校验和,而不是用递增的1、2、3……,因为分布式的版本控制系统要确保每个用户的修改记录都是唯一的,不会发生版本号冲突的情况。
-
HEAD
表示当前版本,HEAD^
表示上一个版本,HEAD~100表示往上100个版本。
git log
-
git log
:显示从最近到最远的提交日志。包含每个提交的SHA1校验和、作者的名字和邮箱、提交时间以及提交说明等。 -
git log --oneline
:git log
的简要版 -
git log --decorate
:不仅输出git log
的信息,还带标签等额外信息。 -
git log --graph
不仅输出git log
的信息,还可查看当前分支什么时候出现了分支、合并。
-
git log 分支名
:查看指定分支的提交日志。 -
git log 要查看的分支名branchA ^要忽略的分支名branchB
:查看branchA的日志信息(排除branchB的信息)
git reflog
- 记录每一次的版本改动。包括commit记录、reset版本退回记录。
git tag
-
git tag
:查看所有标签。注意:标签不是按时间列出,而是按字母排序。 -
git show <tag-name>
:查看指定标签的信息。
-
git tag <tag-name> <commit-id>
:在指定版本号上打上标签。
-
git checkout <tag-name>
:切换到指定标签。
-
git push --tags
:将标签推送给远程仓库。
远程项目
git remote
-
git remote add <shortname> <url>
:添加并关联一个远程库。shortname一般为origin。-
以http方式添加
git remote add origin https://github.com/daking1991/GitTest.git
-
以ssh方式添加
git remote add origin git@github.com:daking1991/GitTest.git
-
-
git remote
:查看已配置的远程仓库,列出各远程仓库的shortname。 -
git remote -v
:查看已配置的远程仓库的读写url。// git remote -v origin git@github.com:daking1991/GitTest.git (fetch) origin git@github.com:daking1991/GitTest.git (push)
-
git remote show <shortname>
:查看shortname对应的远程仓库的fetch和push等详细信息。* remote origin Fetch URL: git@github.com:daking1991/GitTest.git Push URL: git@github.com:daking1991/GitTest.git HEAD branch: (unknown)
-
git remote rm <shortname>
:移除指定的远程仓库。
-
git remote rename <old_shortname> <new_shortname>
:重命名一个远程仓库的shortname。
git push
-
git push <remote-repo-shortname> <local-branch>
:将本地分支推送到远程仓库。
拉取
-
git pull <remote-shortname> <local-branch>
:拉取远程仓库最新提交,并合并到指定的本地分支上。 -
git fetch
:拉取远程仓库最新提交,但不会自动合并分支。
分支
git branch
-
git branch
:列出本地分支列表。当前分支前会标有*号
。 -
git branch -r
:列出远程分支列表。 -
git branch -a
:列出所有分支列表。
-
git branch 分支
:创建新分支。 -
git branch -d 分支
:删除指定分支。
-
git branch -v -a
:查看所有分支的最后一次提交。
git checkout
-
git checkout 分支
:切换到指定分支。 -
git checkout -b 分支
:创建并切换到指定分支。
git merge
-
git merge 分支
:将指定分支合并到当前分支上。
合并冲突
-
不同分支修改了相同区块的代码时,合并分支时git会将此部分标记为冲突,需要用户手动去修改。
冲突文件内容
-
可用
git diff
查看冲突详情冲突详情
-
可用
git status -s
查看冲突文件,状态标识为UU。冲突文件
-
手动修改后,使用
git add
重新写入缓存区。
子模块
- 一个大型工程拆分为一些子工程。既有利于降低工程开发难度,也有利于使用现成的方案或第三方方案作为子工程。
添加子模块
-
步骤
-
在某工程的根目录下,执行
git submodule add git@git.oschina.net:daking/android-client-common.git
-
会多出一个.gitmodules文件,此为子模块配置文件,其内容为
[submodule "android-client-common"] path = android-client-common url = git@git.oschina.net:daking/android-client-common.git # 若有多个子模块,则会有多个条目...
-
-
指定submodule在父工程中的位置
git submodule add git@git.oschina.net:daking/android-client-jni.git ./app/src/main/jni/api
-
指定submodule要跟踪的分支
-
submodule add添加的子模块默认是处于游离状态的,并不处于任何分支上。
-
可指定其要跟踪的分支:
- git submodule add git仓库路径 -b 要跟踪的分支名
- 或直接在.gitmodules配置文件中对应子模块下增加branch = 要跟踪的分支名。
-
clone一个带子模块的Git仓库
- 方案1
-
git clone Git仓库路径
; - 初始化以及更新子模块:
git submodule init
,git submodule update
。
-
- 方案2
git clone --recursive Git仓库路径
参数--recursive会递归初始化并更新每个子模块。
更新子模块
- 先更新子模块,
git submodule update
。若嵌套多层子模块,则git submodule foreach "git submodule update"
。 - 再更新主仓库。
子模块的修改提交
- 在子模块的根目录下,切换到要修改的分支,再进行代码修改。这是因为submodule的HEAD默认是处于游离状态,它并没在任何分支上。
- 在子模块的根目录进行Git提交。
- 在主Git仓库的根目录进行Git提交。
删除子模块
-
删除子模块的Git缓存,
git rm --cached android-client-common/
-
删除子模块的本地文件,
rm -rf android-client-common/
-
删除与此子模块相关的配置
rm -rf .git/modules/android-client-common/ .gitmodules中的相关配置 .git/config中的相关配置
-
修改提交
git add .gitmodules git commit -m 'remove submodule: android-client-common' git push
git config
-
git config --list
:列出所有配置信息。 -
git config <key>
:检查关键字key的配置。如git config user.name
,查看姓名配置。
-
git config --global alias.命令别名 命令
:为指定命令配置一个别名,可快速输入命令。-
git config --global alias.unadd 'reset HEAD'
:使用git unadd 文件
可丢弃指定文件在缓存区的修改。 -
git config --global alias.st status
:使用git st
代替git status
。 -
git config --global alias.co checkout
:使用git co
代替git checkout
。 -
git config --global alias.cm commit
:使用git cm
代替git commit
。 -
git config --global alias.br branch
:使用git br
代替git branch
。 -
git config --global alias.lg "log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit"
:使用git lg
输出高逼格的日志信息。git lg输出高逼格的日志
-
git config --global alias.last 'log -1'
:使用git last
显示最近一次的提交。git last查看最近一条日志
-
-
git config --global user.name "yourname"
和git config --global user.email "youremail"
:修改姓名和邮箱,去掉--global
可针对每个repo单独设定。
网友评论