Git使用细节
- 1. 安装Git
- 2. 基本术语解释
- 3. 复制(Clone)远程代码到本地
- 4. 撤销本地的文件修改
- 5. 在某个分支的基础上创建一个新的分支(本地仓库)
- 6. 用指定的远程分支更新当前的分支
- 7. 关联当前的分支和远程的分支
- 8. 修改当前项目提交(commit)的作者名称
- 9. 修改上一次提交(commit)的作者
- 10. 修改指定提交(commit)的信息(作者或者注释信息)
- 11. 查看提交(commit)的记录:
- 12. 撤销上一次提交(Commit)
- 13. 撤销上一次已经推送(push)上远程仓库的提交
- 14. Merge操作
- 15. 冲突
- 16. 强制覆盖本地文件
- 17. 删除没有加入版本控制(untrak)的文件
- 18. 分享本地仓库
- 19. 创建标签(Tag)
- 20. 推送带特殊字符的分支
- 21. 解决EOF错误
- 22. 修改提交(commit)的作者信息
- 23. 修改远程仓库的地址
- 24. HTTP仓库地址中加入用户名和密码
- 25. 分支覆盖,需要用到强行提交 -f
- 26. Git 查看配置
- 27. Git 帐号名密码保持
Git 是一个免费,开源,分布式源代码管理(版本控制) 系统。本文介绍一些git命令的使用方法,关于git的原理解释就不在此处提及。
安装Git
打开https://git-scm.com/网站,选择系统对应版本的Git安装包下载后安装即可。
基本术语解释
Git仓库 - 代码存储的地方
本地仓库
顾名思义是在你自己本地机器上保存(commit)的代码版本控制信息。
远程仓库(origin)
一个网络上的共享仓库(比如说你在Github上创建一的项目,这个项目地址就是一个共享仓库),本地仓库的代码信息推送(push)到远程仓库上之后,别的开发者就可以拉取(pull)到他们了。
分支(Branch)
Git是通过链表的模式存储代码的每一次提交信息的,分支就是指向这个链表某一个节点的指针。我们可以创建多个分支,然后在这个分支上的提交就会分出一个新的链表。
HEAD
和分支一起使用,HEAD始终指向当前分支的最新的提交点。
提交修改(Commit)
提交修改只是在当前分支创建一个新的节点,这个提交包含代码的变动,并且包含提交的信息和相关的注释(比如修改了什么)。提交只是把代码修改信息保存在本地仓库。
推送(Push)
Push是将本地仓库保持的代码修改信息同步到远程仓库上。
拉取(Pull)
拉取(pull)一个分支意味着把它相关的代码提交(Commit)抓取(fetch)下来并合并(merge)到当前的分支中。
Checkout
修改当前的工作分支为另外一个分支。
复制(Clone)远程代码到本地
1 | $ git clone <版本库网址> <本地文件夹> ## 这个命令是默认建立master分支 |
在clone出master分支之后,在对应的master文件夹下面使用checkout命令可以下载分支的代码
1 | $ git checkout -b branch origin/branch ## 这个命令会在当前目录下载指定分支 |
如果只需要一个branch的代码,可以考虑直接clone一个branch的代码
1 | $ git clone -b <branch name> <版本库网址> <本地文件夹位置(可选)> ## 这个命令可以clone对应的branch代码并且放到指定的文件夹中 |
撤销本地的文件修改
使用远程版本库的文件覆盖本地的文件,其本质是将本地版本库的文件头回退,即是使得git记录文件修改的文件忘记本次修改的内容,然后是用pull更新当前代码。
1 | $ git reset --hard |
在某个分支的基础上创建一个新的分支(本地仓库)
1 | $ git checkout -b <新分支名字> origin/<远程分支名> ## 这个命令只会在本地仓库创建一个新的分支,需要执行提交(commit)和推送( push)命令后才会在远程仓库创建。 |
用指定的远程分支更新当前的分支
这个命令要在需要更新分支的文件目录下执行
1 | $ git pull origin <远程仓库上的分支名> |
关联当前的分支和远程的分支
这个命令可以指定当前本地的分支的拉取操作(pull)和推送操作(push)的远程仓库对应的分支是哪一个(如果是直接从远程分支checkout的分支就默认关联同名)
1 | $ git bran -- set-upstram <localBranch> origin/<remoteBranch> |
修改当前项目提交(commit)的作者名称
1 | $ git config user.name <name> ## 修改用户名称 |
以上的两个步骤也可以打开.git文件目录下的config文件,修改里面的author和email。修改完成之后下一次提交(commit)就会适应这个新的配置了。
修改上一次提交(commit)的作者
1 | $ git commit --amend --author='Gavin Luo <emailmail@main.com>' |
修改指定提交(commit)的信息(作者或者注释信息)
首先用以下命令进入编辑模式
1 | git rebase --interactive commi_id^ |
然后在出现的编辑窗口(vim编辑器类似:i进入编辑模式,esc结束编辑进入命令模式,:w保存修改,:q退出)将要要修改的提交(commit)前面的pick
改成edit
。然后执行命令
1 | git commit --amend |
在出现的界面中填写相关信息后使用以下命令提交修改
1 | git rebase --continue |
查看提交(commit)的记录:
1 | $ git log |
撤销上一次提交(Commit)
如果在提交之前忘记拉取(pull)最新的代码下来会导致无法推送(push)本地修改的代码到远程,这个时候可以先撤销上一次的提交,更新本地代码之后再从那时提交一次就可以了。
重置(reset)命令是可以撤销本地的提交,不过要记得重置(reset)之后要拉取(pull)一下,把远程的更新拉到本地。注意这个命令不会产生新的提交(commit)。
1 | $ git reset HEAD~1 |
撤销上一次已经推送(push)上远程仓库的提交
1 | $ git revert HEAD |
这个命令会产生一个新的提交(commit)。
Merge操作
合并(Merge)
合并是将一个分支的修改内容合并到另外一个分支。首先切换(checkout)到要进行合并(merge)的分支(branch)目录下,然后指定要合并进来的另外一个分支的名字。
1 | $ git checkout localbranch |
Cherry
Cherry 命令可以挑选一个分支上的某些提交(commit)合并到当前分支上。
1 | $ git checkout localbranch |
如果是要同时挑选多个提交(commit)可以使用-n
1 | $ git checkout localbranch |
冲突
执行会导致合并的相关命令(merge、cherry)后如果没有冲突,那么合并对象分支的修改就会合并到当前的分支中了。如果发生了冲突,就需要先打开文件解决冲突,然后把修改好的冲突文件重新添加(add)之后再提交(commit)一次。
强制覆盖本地文件
相信很多人都很烦恼合并(merge)的问题,如果发生了很蛋疼的冲突(难于修复),可以直接用服务器上代码更新本地的代码,但是本地修改就会丢失。
1 | $ git fetch --all |
删除没有加入版本控制(untrak)的文件
不小心批量添加了文件,在没有提交之前可以一次性全部删除
1 | $ git clean -f ## 删除 untracked files |
在命令前加上-n可以查看会被删除掉的文件
1 | $ git clean -nxfd |
分享本地仓库
当你从远程仓库拷贝(clone)代码之后,你本地其实也同时建立了一个完整的仓库。你可以将这个仓库作为团队开发时的共享仓库
在windows系统下,你只需要共享你的项目文件夹,然后让其他组员通过git clone file:///$你的共享项目路径
就可以了。
如果其他组员也下载了远程仓库的代码,那么可以让他们修改.git文件夹内的config文件,将其中的[remote “origin”]下的ulr地址改成你的共享文件夹目录就可以了,记得加上file:///
,并且在你的共享地址前面加上\
进行转义,所以url的值应该看起来是这样的:file:///\\hostname\file_path
。
当你共享了自己的仓库给其他用户之后,记得开启写权限给他们。
还有一个一定要注意的问题,如果你和你组员都需要提交到同样的branch,那么你不能占用那个branch,你必须也重新建立一个branch来进行你的工作。否则,如果其他人要提交的branch在你的工作环境中是check out的状态的话,别人提交会有 unpacker err。
创建标签(Tag)
标签通常是用来标识提交链表(commit ancerstry chain)中的某一点,他和提交(commit)信息绑定在一起。
git tag <tagename>
。 这个命令是给当前的提交(commit)打上一个轻量级的标签(tag)。git tag -a <tagename> -m <tagmessage>
。这个命令是个当前提交(commit)打上一个带有备注的标签(tag)。git push origin <tagename>
发布标签(tag)到远程仓库git push origin --tags
发布所有的本地标签(tag)到远程仓库。
推送带特殊字符的分支
需要用反斜杠进行转义
1 | git push origin HEAD:bugfix/XXX |
解决EOF错误
- fatal: The remote end hung up unexpectfataledly | 12.00 KiB/s
- early EOF
fatal: index-pack failed
这个错误是读取远程仓库的时候丢失数据或者数据损坏导致的。解决方法是加大缓存: git config –global http.postBuffer 104857600
修改提交(commit)的作者信息
1 |
|
之后要使用 git push --force --tags origin 'refs/heads/*'
强制覆盖提交
参考:https://www.hidennis.tech/2016/06/07/git-change-author-email/
修改远程仓库的地址
一个git项目可以有多个仓库, 可以使用命令git remote
列出所有的远程仓库; 使用git remote get-url <仓库名, 比如origin>
显示仓库地址。
使用git remote set-url origin <url_path>
来设置指定的仓库地址
HTTP仓库地址中加入用户名和密码
格式为https://username:passwoard@git.address
。如果username或者password中包含有特殊字符需要进行转义。 常见的特殊字符为 :
: %3A
;@
: %40
; (空隔)
:%20
。其他特殊字符可以自行网上查找
分支覆盖,需要用到强行提交 -f
1 | git reset --hard origin/branch |
Git 查看配置
1 | git config user.name ##查看用户名 |
Git 帐号名密码保持
账户名密码会保存到windows credential里面,如果不小心输错了可能会导致之后一直用这个错误,可以打开控制面板然后修改。