git起步
2021-01-28
- git:每一次的clone操作,实际上都是对一次代码仓库的完整备份。
- git中文件的三种状态:已修改(modified)和已暂存(staged),已提交(committed):
- 已修改tag1表示已修改了某个文件,但还没有提交保存(git add之前);
- 已暂存表示把已修改的文件放在下次提交的清单中(git add 之后);
- 已提交表示该文件已经被安全保存在本地数据库中(git commit之后);
- 每个项目都有一个git目录(.git),git工作流程如下:
- 在工作目录(.git的兄弟目录)中修改某些文件;
- 对修改后的文件保存到暂存区域;
- 提交跟新,将暂存区域的文件快照转储到git目录中。
- 提交到远程仓库。
开始 #
- 安装git,配置个人用户名称和电子邮件地址。
git config --global user.name "xiaoxiang"
git config --global user.email "xiaoxiang@xxxx.com"
- 可以使用
git config --list
查看已有的配置信息。 - 从现有的git仓库克隆
git clone [远程仓库]
。 - 工作目录下的文件分为两种状态:已跟踪和未跟踪:
- 已跟踪是本地仓库中有的文件,初次克隆某个仓库时,工作目录的所有文件都是已跟踪的文件。
- 未跟踪是新创建的文件,即对该文件从来没有执行git add命令。
- 当编辑过某些文件后,git将这些文件标记为已修改,这就跟 tag1对于上了。
- 使用
git add
开始跟踪一个新文件,git add .
暂存当前路径下的所有的已修改的文件。- 通过
git status
可以查看文件的状态。 - 取消已暂存的状态
git reset [--mixed] HEAD "文件名"
,该方式会清除暂存区的数据,保留工作目录的数据。
- 通过
- 使用
git commit -m "提交说明"
来提交暂存区的数据到本地仓库。 - 使用
git push origin master
将修改提交到远程仓库。(使用ssh-keygen
生成密钥,并将公钥放到git上去,以后提交就不用输账号和密码了)。git push [remote-name] [branch-name]
,这是完整命令。
.gitignore #
-
可以创建一个.gitignore文件,来指明哪些文件不需要被提交到仓库。
-
.gitignore
文件的格式规范如下:- 所有空行或者以
#
开头的行都会被Git忽略。 - 忽略指定的模式以外的文件或者目录,可以在模式前加上
!
。 - 匹配模式以
/
开头防止递归。 - 匹配模式以
/
结尾防止递归。 *
匹配零个或多个任意字符,[a-c]
匹配任意一个列在方括号中的字符,?
只匹配任何一个字符,**
表示匹配任意中间目录。
- 所有空行或者以
#忽略所有的.a文件
*.a
#跟踪所有的lib.a,即使在前面忽略了.a文件
!lib.a
#只忽略当前目录下的TODO文件,而不忽略subdir/TODO文件
/TODO
#忽略任何目录下名为build的文件夹
build/
#忽略doc/notes.txt,但不忽略doc/server/arch.txt
doc/*.txt
#忽略doc/目录及其所有子目录下的.pdf文件
doc/**/*.pdf
git stash #
git stash push [-m "暂存的备注"]
暂存当前的更改,并将本地恢复到HEAD。-m是可选的,该参数会给此次暂存加个备注。git stash list
列出当前所有的暂存,最新的是stash@{0}
。git stash pop
应用stash@{0},并删除stash@{0}。git stash drop stash@{0}
从stash列表中删除stash@{0}。git stash apply stash@{0}
应用stash@{0},但不删除stash@{0}
- 查看文件修改了什么地方,可以使用
git diff
指令。 - 查看提交历史
git log
,后跟-2
只会显示最近两次的跟新。 - 切换到其他分支
git checkout master
。 git tag
可以给某一时间点的版本打标签。git update-index --assume-unchanged 文件名
:取消本地跟踪git update-index --no-assume-unchanged 文件名
:恢复本地跟踪- 协议:
- ssh协议:唯一一个同时支持读写操作的网络协议,但无法实现对仓库的匿名访问。
- git协议:该协议通常用来克隆,通常不能用来推送(因为没有授权机制,如果允许推送操作,每一个知道该URL的人都有推送权限),比http协议高效。
- http/s协议:容易搭建,通常用来克隆。
git remote #
#列出指定的每一个远程服务器的简写
git remote
#显示远程仓库的简写与对应的URL
git remote -v
#查看某个远程仓库的更多信息,会列出远程仓库的URL和跟踪分支的信息。
git remote show origin
#添加一个远程仓库,并指定一个简写
git remote add origin https://xxx.xxx/xxx/xxx
#修改仓库的远程地址
git remote set-url origin 仓库地址
#远程仓库的重命名
git remote rename origin paul
#移除一个远程仓库
git remote remove paul
#git fetch只会将数据下载到本地仓库,并不会合并。需要手动合并
git fetch origin
#自动抓取远程分支并合并到本地分支
git pull
git branch #
- 只有在本地修改或者产生了文件才会创建主分支master,这个时候才能创建新分支。
git branch
查看所有的分支,*
表示当前分支。git checkout -b testing
相当于git branch testing (创建一个分支)和 git checkout testing(切到该分支)
- 删除分支
git branch -d testing
- 分支的合并:在当前分支下(如master),执行
git merge testing
,会创建新的commit对象,master也会指向他。该commit对象有两个父指针。 - 分支的合并会用两个分支的末端以及他们的共同祖先进行一次的三方合并,当两个分支在同一个commit链上时,旧一点的那个分支发起合并,则将其直接指向了新一点的那个分支。
- 有时候分支合并会失败,比如两个分支同时修改了相同的文件。这个时候
git merge testing
仍然做了合并,但是没有提交,可以使用git status
查看,此时就需要手动合并了。 git branch --merged
查看那些分支已被并入当前分支。git branch --no-merged
查看尚未合并的分支。
参考链接: Pro Git
参考链接: Git - 记录每次更新到仓库 (git-scm.com)
参考链接:开源指北