https://git-scm.com/downloads
一直点下一步就可以,安装完后打开方法:‘开始菜单’-->'Git'-->''Git Bash
安装完成后设置名字和电子邮件
bash基本操作
1)、cd : 改变目录。
2)、cd . . 回退到上一个目录,直接cd进入默认目录
3)、pwd : 显示当前所在的目录路径。
4)、ls(ll): 都是列出当前目录中的所有文件,只不过ll(两个ll)列出的内容更为详细。
5)、touch : 新建一个文件 如 touch index.js 就会在当前目录下新建一个index.js文件。
6)、rm: 删除一个文件, rm index.js 就会把index.js文件删除。
7)、mkdir: 新建一个目录,就是新建一个文件夹。
8)、rm -r : 删除一个文件夹, rm -r src 删除src目录, 好像不能用通配符。
9)、mv 移动文件, mv index.html src index.html 是我们要移动的文件, src 是目标文件夹,当然, 这样写,必须保证文件和目标文件夹在同一目录下。
10)、reset 重新初始化终端/清屏。
11)、clear 清屏。
12)、history 查看命令历史。
13)、help 帮助。
14)、exit 退出。
15)、#表示注释
1.切换目录
2.通过 git init 命令把当前目录变成git可以管理的仓库
会生成一个.git目录,如果没有看见运行 ls -ah 就可以查看到
hello.html内容“hello world”
把文件提交到仓库
-m 后面输入的是本次提交的说明
查看配置
git config -l 查看git环境详细配置
git config --global --list 查看当前用户配置
更改hello.html内容为 'hello git!'
运行git status 查看状态
git diff hello.html 查看哪里做了修改
知道哪里修改后在提交 git add hello.html git commit -m "add distributed" git log 查看历史记录
git log --pretty=oneline 一行显示 退回上次修改的某个版本 git reset --hard a8d2be07ab1a718179e08f78f430fd91cc3cad33 git reflog 记录每一次提交的commit id,然后通过这个可以恢复到某个版本
总结:
#HEAD指向的版本就是当前版本,因此,Git允许我们在版本的历史之间穿梭,使用命令git reset --hard commit_id。
#穿梭前,用git log可以查看提交历史,以便确定要回退到哪个版本。
#要重返未来,用git reflog查看命令历史,以便确定要回到未来的哪个版本。
工作区:working directory 就是一个目录 learngit文件夹就是一个工作区
版本库:repository 工作区的隐藏目录 .git 这个不是工作区,而是git的版本库
Git的版本库里存了很多东西,其中最重要的就是称为stage(或者叫index)的暂存区,还有Git为我们自动创建的第一个分支master
,以及指向master
的一个指针叫HEAD
。
前面讲了我们把文件往Git版本库里添加的时候,是分两步执行的:
第一步是用git add把文件添加进去,实际上就是把文件修改添加到暂存区;
第二步是用git commit提交更改,实际上就是把暂存区的所有内容提交到当前分支
需要提交的文件修改通通放到暂存区,然后,一次性提交暂存区的所有修改。
场景1:当你改乱了工作区某个文件的内容,想直接丢弃工作区的修改时,用命令git checkout -- file。
场景2:当你不但改乱了工作区某个文件的内容,还添加到了暂存区时,想丢弃修改,分两步,第一步用命令git reset HEAD file,就回到了场景1,第二步按场景1操作
git rm filename
生成密匙
$ ssh-keygen -t rsa -C "1184405959@qq.com"
C:\Users\Administrator\.ssh目录下找到id_rsa.pub复制里面所有内容
github账号-->your profile-->edit profile-->SSH and GPG key-->New SSH key-->粘贴key
1.GitHub 上选择new repository 创建一个learn-git 仓库
2.把本地仓库文件上传到远程
git remote add origin https://github.com/derek-zhang123/learn-git.git
git push -u origin master #上传所有 第一次要加-u 以后就直接 git push origin master
如果报错 运行如下命令再重复上传一次
git remote rm origin
在github创建learn-git仓库
克隆到本地
git clone https://github.com/derek-zhang123/learn-git
然后在本地会生成一个learn-git目录,里面克隆了remote仓库所有的文件
git branch dev #创建分支
git checkout dev #切换到div分支
#可以合并一个命令 创建并切换到dev
git checkout -b dev
添加内容到hello.html,
然后提交
这是在分支dev上做的操作,提交完成后,切换到master分支
这个时候查看hello.html的内容时,发现刚才添加的内容并没有显示,因为那是在dev分支上提交的,而master分支并没有变
现在,把dev上的工作合并到master分支上:
git merge dev
再查看时,刚才添加的内容可以看到了
删除分支dev
git branch -d dev
如果要丢弃一个没有被合并过的分支,可以通过git branch -D <name>
强行删除。
总结:
查看分支:git branch
创建分支:git branch <name>
切换分支:git checkout <name>
创建+切换分支:git checkout -b <name>
合并某分支到当前分支:git merge <name>
删除分支:git branch -d <name>
当分支dev和master都修改了hello.html,合并会提示冲突
这个时候需要手动解决冲突(在master分支修改内容后用下面的命令提交)
git merge --no-ff -m "merge with no-ff" dev
合并分支时,加上--no-ff
参数就可以用普通模式合并,合并后的历史有分支,能看出来曾经做过合并,而fast forward
合并就看不出来曾经做过合并。
修复bug时,我们会通过创建新的bug分支进行修复,然后合并,最后删除;
当手头工作没有完成时,先把工作现场git stash
一下,然后去修复bug,修复后,再git stash pop
,回到工作现场。
多人协作的工作模式通常是这样:
git push origin branch-name
推送自己的修改;
git pull
试图合并;
git push origin branch-name
推送就能成功!
如果git pull
提示“no tracking information”,则说明本地分支和远程分支的链接关系没有创建,用命令git branch --set-upstream branch-name origin/branch-name
。
这就是多人协作的工作模式,一旦熟悉了,就非常简单。
总结:
查看远程库信息,使用git remote -v;
本地新建的分支如果不推送到远程,对其他人就是不可见的;
从本地推送分支,使用git push origin branch-name,如果推送失败,先用git pull抓取远程的新提交;
在本地创建和远程分支对应的分支,使用git checkout -b branch-name origin/branch-name,本地和远程分支的名称最好一致;
建立本地分支和远程分支的关联,使用git branch --set-upstream branch-name origin/branch-name;
从远程抓取分支,使用git pull,如果有冲突,要先处理冲突。
创建标签 git tag v1.0 查看标签 git tag 默认标签打在最新的commit提交上,要想给历史的提交打上标签,也很简单。先找到标签 git log --pretty=oneline --abbrev-commit
比如要给add xxx添加上标签,找到它对应的commit id添加 git tag v0.9 098f23b
查看标签信息:git show v0.9
删除标签: git tag -d v0.9
推送标签:git push origin v1.0
一次推送全部标签:git push origin --tags
如果标签已经推送到远程,要删除远程标签就麻烦一点,先从本地删除:
git tag -d v1.0
再删除远程:
git push origin :refs/tags/v1.0
总结:
命令git push origin <tagname>可以推送一个本地标签;
命令git push origin --tags可以推送全部未推送过的本地标签;
命令git tag -d <tagname>可以删除一个本地标签;
命令git push origin :refs/tags/<tagname>可以删除一个远程标签。
访问主页https://github.com/twbs/bootstrap,点“Fork”就在自己的账号下克隆了一个bootstrap仓库,然后,从自己的账号下clone:
git clone https://github.com/derek-zhang123/bootstrap
#本地使用
git init
ls -ah #查看隐藏
git status #查看状态
git add -A #添加所有
git commit -m "提交信息"
git diff #查看文件更改的变化
git checkout -- . #撤销修改
git reset --hard 55f9ddb #回退到某个版本 后面七位数字是commit id
git reflog
git clean -xf #删除当前目录下所有没有track过的文件
git config --global core.quotepath false #文件名字是中文时,解决乱码显示问题
#git与github关联
git config --global user.name "你的用户名"
git config --global user.email "你的邮箱"
ssh-keygen -t rsa -C "你的邮箱" #生成ssh key
clip < ~/.ssh/id_rsa.pub #将生成的key复制到粘贴板
git push -u origin master
git pull origin master
git remote add origin 你复制的地址
git push
git clone https://github.com/schaepher/blogsbackup.git #下载别人的代码到本地
四个工作区域
Workspace:工作区,就是你平时存放项目代码的地方
Index / Stage:暂存区,用于临时存放你的改动,事实上它只是一个文件,保存即将提交到文件列表信息
Repository:仓库区(或本地仓库),就是安全存放数据的位置,这里面有你提交到所有版本的数据。其中HEAD指向最新放入仓库的版本
Remote:远程仓库,托管代码的服务器,可以简单的认为是你项目组中的一台电脑用于远程数据交换
其它概念
Directory:使用Git管理的一个目录,也就是一个仓库,包含我们的工作空间和Git的管理空间。
WorkSpace:需要通过Git进行版本控制的目录和文件,这些目录和文件组成了工作空间。
git:存放Git管理信息的目录,初始化仓库的时候自动创建。
Index/Stage:暂存区,或者叫待提交更新区,在提交进入repo之前,我们可以把所有的更新放在暂存区。
Local Repo:本地仓库,一个存放在本地的版本库;HEAD会只是当前的开发分支(branch)。
Stash:隐藏,是一个工作状态保存栈,用于保存/恢复WorkSpace中的临时状态
git工作流程
在工作目录中添加、修改文件;
将需要进行版本管理的文件放入暂存区域;
将暂存区域的文件提交到git仓库。
git管理的文件有三种状态:
已修改(modified)
已暂存(staged)
已提交(committed)
版本控制就是对文件的版本控制,要对文件进行修改、提交等操作,首先要知道文件当前在什么状态,不然可能会提交了现在还不想提交的文件,或者要提交的文件没提交上。GIT不关心文件两个版本之间的具体差别,而是关心文件的整体是否有改变,若文件被改变,在添加提交时就生成文件新版本的快照,而判断文件整体是否改变的方法就是用SHA-1算法计算文件的校验和。
git add
状态变为Staged
.
Modified
. 如果使用git rm
移出版本库, 则成为Untracked
文件
git add
可进入暂存staged
状态, 使用git checkout
则丢弃修改过, 返回到unmodify
状态, 这个git checkout
即从库中取出文件, 覆盖当前修改
git commit
则将修改同步到库中, 这时库中的文件和本地文件又变为一致, 文件为Unmodify
状态. 执行git reset HEAD filename
取消暂存, 文件状态为Modified
忽略特殊文件.gitignore
在Git工作区的根目录下创建一个特殊的.gitignore
文件,然后把要忽略的文件名填进去,Git就会自动忽略这些文件
不需要从头写.gitignore
文件,GitHub已经为我们准备了各种配置文件,只需要组合一下就可以使用了。所有配置文件可以直接在线浏览:https://github.com/github/gitignore
忽略文件的原则是:
.class
文件;# Byte-compiled / optimized / DLL files
__pycache__/
*.py[cod]
*$py.class
# C extensions
*.so
# Distribution / packaging
.Python
build/
develop-eggs/
dist/
downloads/
eggs/
.eggs/
lib/
lib64/
parts/
sdist/
var/
wheels/
*.egg-info/
.installed.cfg
*.egg
MANIFEST
# PyInstaller
# Usually these files are written by a python script from a template
# before PyInstaller builds the exe, so as to inject date/other infos into it.
*.manifest
*.spec
# Installer logs
pip-log.txt
pip-delete-this-directory.txt
# Unit test / coverage reports
htmlcov/
.tox/
.coverage
.coverage.*
.cache
nosetests.xml
coverage.xml
*.cover
.hypothesis/
.pytest_cache/
# Translations
*.mo
*.pot
# Django stuff:
*.log
local_settings.py
db.sqlite3
# Flask stuff:
instance/
.webassets-cache
# Scrapy stuff:
.scrapy
# Sphinx documentation
docs/_build/
# PyBuilder
target/
# Jupyter Notebook
.ipynb_checkpoints
# pyenv
.python-version
# celery beat schedule file
celerybeat-schedule
# SageMath parsed files
*.sage.py
# Environments
.env
.venv
env/
venv/
ENV/
env.bak/
venv.bak/
# Spyder project settings
.spyderproject
.spyproject
# Rope project settings
.ropeproject
# mkdocs documentation
/site
# mypy
.mypy_cache/
最后一步就是把.gitignore
也提交到Git,就完成了!