几个区域的区别,及git工作流程
参考:廖雪峰的官方网站-git,这里面写得非常清楚,咱们就不要再造轮子了,现在把我常用的几个功能写一下,以防忘记。
此为Windows下的git。
文章目录
1. 安装
从https://git-for-windows.github.io下载,然后正常安装即可。
2. 创建账号
安装完成后,找到git bash打开;
输入命令
$ git config --global user.name "Your Name"
$ git config --global user.email email@example.com
完成账号创建。
2.1 设置当前仓库的用户名和邮箱
git config user.name "Your Username"
git config user.email "your-email@example.com"
有时候开发需要连接不同的git,账号可能会不同,可以单独设置当前仓库的用户名和密码。
3. 创建本地版本库
打开git bash,通过命令进入需要创建版本库的文件夹,输入命令:
git init
完成版本库的创建
4. 添加文件
在git bash中通过git add命令将文件夹内文件添加至版本库,add命令有很多参数,具体可在网上找到,以下命令可将所有文件添加到版本库:
git add .
5. 提交
在git bash中通过git commit命令将add的文件提交到版本库,完成版本更新。命令如下:
git commit -m "create repo"
引号内为本次commit标记。
提交后修改commit描述:
git commit --amend
6. 本地库同步至github
在完成了本地库的创建后,可将本地库同步至github。
6. 1 本地生成ssh key
在git bash中输入:
ssh-keygen -t rsa -C "email@example.com"
会提示生成的ssh key,一路回车键
6. 2 将ssh key添加到github
key中填生成的id_rsa.pub文件内容,生成文件的目录在上图中… save the key (路径)
6. 3 github创建版本库
填写完名字后记住:不要勾选 “Initialize this repository with a README”,勾选了其实也没事,就是麻烦一些,网上可以找到解决方案。
6. 4 本地库关联github仓库
创建完github库后,将github仓库地址复制下来,就是那个
https://github.com:xxxxx/ccc.git
通过git bash进入需要同步的本地仓库,在命令行中输入:
git remote add origin https://github.com:xxxxx/ccc.git
完成关联
6. 5 本地库同步至github
git push -u origin master
第一次同步需要加“-u”,后面就不需要了。
详细如下:
7 从远程库克隆、获取、上传
克隆
git clone git@github.com:xxxxx/ccc.git
从关联的远程仓库获取到本地
git pull origin master
从本地上传到关联的远程仓库
# 本地master传到远程的origin:master分支
git push origin master
# 本地master传到远程的orgin:develop分支
git push origin master:develop
比较本地与远程仓库的区别
git fetch origin
git diff origin/master
8 忽略文件和路径 .gitignore、不再跟踪
https://github.com/github/gitignore上有各种项目的忽略文件模板。
# 忽略指定的文件名
bin
# 通过正则表达式忽略文件
[Bb]uild
# 忽略特定后缀文件
*.exe
# 忽略根目录文件夹
/bin/
# 忽略指定文件夹下的文件
bin/*
# 忽略指定文件夹
bin/
由于需要创建.gitignore文件,而windows上无法直接创建无文件名的文件,可以借助git bash创建,也可以使用touch创建文件。
# 打开.gitignore文件
vim .gitignore
注意:.gitignore需放在与.git文件夹同级的目录下;而非.git下
各种工程的gitignore文件参考:https://github.com/github/gitignore/
删除跟踪文件,有时候发现这个文件不需要再跟踪了:
# 只删除跟踪,不删除本地文件
git rm --cached <文件路径>
# 删除跟踪并删除本地文件
git rm <文件路径>
9 分支管理
# 创建分支b1
git checkout -b b1
# 切换到分支master
git checkout master
# 将A分支的f1文件合并到当前分支(需要再次确认,y yes,a all,n no...)
git checkout --patch A f1
# 删除本地分支
git branch -d [branch name]
在实际使用过程中遇到一个很坑爹的事情:我在A分支创建了一个文件,然后切换回master分支,发现master分支也出现了这个文件;按我的理解,在哪个分支创建的文件只属于某一分支,不应该出现在其他分支的。在网上找到了一个解释:《新建的文件没有纳入版本管理,所以会被带到切换的分支》。新建的文件是个普通文件,并不属于某一分支,所以在任何分支都能看到。所以记住:添加文件后记得立马commit一下。
10 版本回退、版本切换
# 切换到指定版本
git reset --hard 版本id
# 查看版本id
git log
# 查看版本切换日志(包含所有的版本id)
git reflog
有时候本地commit后,发现有修改的文件未加进去,不想两次commit,则可以删除前一次commit后,再次add commit:
git reset HEAD~1
11 查看文件列表
git ls-files
12 文件比较
几个区:
-
- 工作区,当前在编辑的内容
-
- 暂存区,git add后的区
-
- 本地版本库,git commit后的区
-
- 本地远程分支,git push、git fetch、git pull 都会经过本地远程分支区,是本地版本库和远程版本库的桥梁
-
- 远程版本库,在服务器上的版本库
12.1 工作区与暂存区的比较
# 工作区与暂存区比较
git diff
# 简短区别
git diff --stat
# 指定文件
git diff filepath
12.2 工作区与本地版本库
# 工作区与HEAD ( 当前工作分支) 比较
git diff HEAD
# 指定文件
git diff HEAD filepath
# 指定版本
git diff <commitID>
# 指定版本指定文件
git diff <commitID> filepath
# 工作区文件与branchName 分支的文件进行比较
git diff branchName filepath
12.3 暂存区与版本库
# git diff --staged 或 --cached filepath 暂存区与HEAD比较
git diff --cached // 暂存区和最新版本库
git diff --cached <commitID> // 暂存区和某版本库
git diff --cached <comitID> -- <fileName>
12.4 不同版本库
git diff <commitID> <commitID2>
git diff <commitID> <commitID2> -- <fileName>
12.5 暂存区与本地远程区
git diff origin/master
13 协作
团队协作时,通常有多个维护一个项目。每次提交前,需拉取远程仓库的修改,合并到本地后,再提交到远程仓库。
- git fetch 拉取远程仓库修改记录到本地仓库
- git merge 本地仓库合并到工作目录
- git commit 工作目录提交到本地仓库
- git push 本地仓库提交到远程仓库
本地和远程都修改
-
- git stash 隐藏本地修改
-
- git pull 拉取远程修改(或 git fetch + git merge)
-
- git stash pop stash@{id} 恢复隐藏的本地修改
git stash
- 隐藏git stash save “save xxx”
- 查看 git stash list
- 恢复git stash pop stash@{0}
忽略对文件权限的修改
在linux上经常因为文件权限修改后,git status会爆红,忽略的方法:
#设置了忽略文件权限。
git config core.filemode false
#查看配置
cat .git/config
#也可以直接修改git配置文件中的filemode字段,默认为true
vi .git/config
error 常见错误
可能遇到的错误:
- 如何解决failed to push some refs to git,与github同步后,添加了remark文件但未同步至本地时会出现此错误。
先输入如下命令,将数据同步到本地,再将本地数据同步到github就不会有问题了。
git pull --rebase origin master`
- Unlink of file ‘.git/objects/pack/pack-***.pack’ failed. Should I try again? (y/n)
是因为文件被占用了,关闭占用即可