Git安装
Windows上安装Git
64 位安装包下载地址 : https://github.com/git-for-windows/git/releases/download/v2.16.2.windows.1/Git-2.16.2-64-bit.exe
步骤6 选择第二项
Use Git from the Windows Command Prompt
步骤7 选择第二项
Use the native Windows Secure Channel library
步骤8 选择第一项
Checkout Window-style,commit Unix-style line endings
步骤9 选择第二项
Use Windows' default console window
在对应路径右键调用Git Bash here
安装完git后设置:
$ git config --global user.name "Your Name"
$ git config --global user.email "email@example.com"
(此用户名和邮箱是git提交代码时用来显示你身份和联系方式的,并不是github用户名和邮箱)
查看用户名和邮箱地址
$ git config user.name
$ git config user.email
切换目录,目录最好英文
cd /f/unfishied/git
创建一个空目录
$ mkdir learngit
$ cd learngit
$ pwd
把这个目录变成Git可以管理的仓库
$ git init
在learngit目录或子目录下创建文件
**把本地的修改提交到stage **
git add [file1] [file2] ... # 添加指定文件到暂存区
git add [dir] # 添加指定目录到暂存区,包括子目录
git add . # 添加当前目录的所有文件到暂存区
git rm [file1] [file2] ... # 删除工作区文件,并且将这次删除放入暂存区
git rm --cached [file] # 停止追踪指定文件,但该文件会保留在工作区
报错信息:
warning: LF will be replaced by CRLF in ......
The file will have its original line endings in your working directory. 解决方法:
git config --global core.autocrlf false
原因是路径中存在 / 的符号转义问题,false就是不转换符号默认是true,相当于把路径的 / 符号进行转义,这样添加的时候就有问题
第二步,用命令git commit告诉Git,把文件提交到仓库:
$ git commit -m "wrote a readme file"
解析:-m 后面输入的是本次提交的说明,
查看查看当前分支有哪些修改
$ git status
查看文件具体的修改内容
$git diff readme.txt
查看当前分支上面的日志信息 --pretty=oneline单行显示
git log --pretty=oneline
查看某个文件的每一行的修改记录()谁在什么时候修改的)
git blame someFile
撤销本地修改
$ git reset --hard HEAD
查看文件内容
$ cat readme.txt
回到未来某个版本 commit id bf2a (版本号写前几位就可以)
$ git reset --hard bf2a
记录你的每一次命令
git reflog
撤销修改
一种是readme.txt修改后还没add,只在工作区
一种是add后被添加到暂存区
回到工作区
git reset HEAD
git resetgi命令既可以回退版本,也可以把暂存区的修改回退到工作区
git status 查看
to unstage 在暂缓区
working directory 在工作区
丢弃工作区
git checkout --readme.txt
删除文件
在资源管理器中 删除文件后你有两个选择
使用git rm删除,并且git commit;
另一种情况是删错了, 因为版本库里还有
$ git checkout --test.txt
git checkout其实是用版本库你的版本替换工作区的版本,
无论工作区是修改还是删除,都可以"一键还原"
git stash //把未完成的修改缓存到栈容器中
git stash list //查看所有的缓存
git stash pop //恢复本地分支到缓存状态
发现有一个类是多余的,想删掉它又担心以后需要查看它的代码,想保存它但又不想增加一个脏的提交。这时就可以考虑git stash。
使用git的时候,我们往往使用分支(branch)解决任务切换问题,例如,我们往往会建一个自己的分支去修改和调试代码, 如果别人或者自己发现原有的分支上有个不得不修改的bug,我们往往会把完成一半的代码commit提交到本地仓库,然后切换分支去修改bug,改好之后再切换回来。这样的话往往log上会有大量不必要的记录。其实如果我们不想提交完成一半或者不完善的代码,但是却不得不去修改一个紧急Bug,那么使用git stash就可以将你当前未提交到本地(和服务器)的代码推入到Git的栈中,这时候你的工作区间和上一次提交的内容是完全一样的,所以你可以放心的修Bug,等到修完Bug,提交到服务器上后,再使用git stash apply将以前一半的工作应用回来。
经常有这样的事情发生,当你正在进行项目中某一部分的工作,里面的东西处于一个比较杂乱的状态,而你想转到其他分支上进行一些工作。问题是,你不想提交进行了一半的工作,否则以后你无法回到这个工作点。解决这个问题的办法就是git stash命令。储藏(stash)可以获取你工作目录的中间状态——也就是你修改过的被追踪的文件和暂存的变更——并将它保存到一个未完结变更的堆栈中,随时可以重新应用。
远程仓库
C:UsersAdministrator.ssh
1.创建SSH Key,在用户主目录下,看看有没有.SSH目录,再看看目录下有没有
id_rsa(私钥)和id_rsa.pub(公钥)这两个文件
公钥与私钥使用场景:
(1)私钥用来进行解密和签名,是给自己用的。
(2)公钥由本人公开,用于加密和验证签名,是给别人用的。
(3)当该用户发送文件时,用私钥签名,别人用他给的公钥验证签名,可以保证该信息是由他发送的。当该用户接受文件时,别人用他的公钥加密,他用私钥解密,可以保证该信息只能由他接收到。
如果没有
添加ssh key
$ ssh-keygen -t rsa -C "yh-2@qq.com"
Account settings-Add SSH Key
在Key 文本框里粘贴id_rsa.pub文件的内容
在GitHub上创建一个远程仓库
Create a new repo
Repository name填入learngit
关联远程库
git remote add origin git@github.com:Carroll9527/learngit.git
Carroll9527替换成自己的Git用户名
远程库的名字就是origin,这是Git默认的叫法
Git name只是展示名, username才是用户名
推送
git push -u origin master
-u参数,git不但会把本地的master分支内容推送新的远程分支,还会把本地
master分支和远程master关联起来,指定orign为默认主机,后面就可以不加
任何参数, 使用git push了
远程分支上存在本地分支中不存在的提交,往往是多人协作开发过程中遇到的问题,可以先fetch再merge,也就是pull,把远程分支上的提交合并到本地分支之后再push。
如果你确定远程分支上那些提交都不需要了,那么直接git push origin master -f,强行让本地分支覆盖远程分支。
强行覆盖
git push origin master -f
推送其他分支
git push origin dev
master分支是主分支,因此要时刻与远程同步;
dev分支是开发分支,团队所有成员都需要在上面工作,所以也需要与远程同步;
bug分支只用于在本地修复bug,就没必要推到远程了,除非老板要看看你每周到底修复了几个bug;
feature分支是否推到远程,取决于你是否和你的小伙伴合作在上面开发。
//从远程仓库克隆
$ git clone git@github.com:carroll/gitskills.git
创建合并分支
查看分支:git branch
创建分支:git branch
切换分支:git checkout
创建+切换分支:git checkout -b
合并某分支到当前分支:git merge
删除分支:git branch -d
解决冲突
创建不同分支然后提交
合并分支
git merge feature1
状态
git status
查看readme.txt的内容
<<<,===,标记出不同分支的内容
查看合并的日志情况
git log --graph --pretty=oneline --abbrev-commit
--abbrev-commit 仅显示 SHA-1 的前几个字符,而非所有的 40 个字符
普通方式合并
git merge --no-ff -m "merge with no-ff" dev
合并分支时,加上--no-ff参数就可以用普通模式合并,合并后的历史有分支,能看出来曾经做过合并,而fast forward合并就看不出来曾经做过合并。
工程进行到一半,没办法提交
git stash 把现工作区存储起来
查看工作现场
git stash list
恢复同时把stash内容删除
git stash pop
如果要丢弃一个没有被合并过的分支,
可以通过git branch -D
查看远程仓库的信息
git remote -v
推送分支
git push origin dev
master分支是主分支,因此要时刻与远程同步;
dev分支是开发分支,团队所有成员都需要在上面工作,所以也需要与远程同步;
bug分支只用于在本地修复bug,就没必要推到远程了,除非老板要看看你每周到底修复了几个bug;
feature分支是否推到远程,取决于你是否和你的小伙伴合作在上面开发。
同步冲突
先指定本地dev分支与远程origin/dev分支的链接
git branch --set-upstream-to=origin/dev dev
多人协作的工作模式通常是这样:
首先,可以试图用git push origin <branch-name>推送自己的修改;
如果推送失败,则因为远程分支比你的本地更新,需要先用git pull试图合并;
如果合并有冲突,则解决冲突,并在本地提交;
没有冲突或者解决掉冲突后,再用git push origin <branch-name>推送就能成功!
如果git pull提示no tracking information,则说明本地分支和远程分支的链接关系没有创建,用命令git branch --set-upstream-to
git diff HEAD 比较的是工作区中的文件与版本库中文件的差异
Rebase
rebase操作的特点:把分叉的提交历史“整理”成一条直线,看上去更直观。缺点是本地的分叉提交已经被修改过了。
git rebase
git diff
(1)当暂存区中没有文件时,git diff比较的是,工作区中的文件与上次提交到版本库中的文件。
(2)当暂存区中有文件时,git diff则比较的是,当前工作区中的文件与暂存区中的文件
git diff HEAD -- file,比较的是工作区中的文件与版本库中文件的差异
git diff --cached 查看已经add但是没有commit的内容
git fetch 和git pull 的差别
1、git fetch 相当于是从远程获取最新到本地,不会自动merge,如下指令:
git fetch orgin master //将远程仓库的master分支下载到本地当前branch中
git log -p master ..origin/master 比较本地的master分支和origin/master分支的差别
git merge origin/master //进行合并
也可以用以下指令:
git fetch origin master:tmp //从远程仓库master分支获取最新,在本地建立tmp分支
git diff tmp //將當前分支和tmp進行對比
git merge tmp //合并tmp分支到当前分支
- git pull:相当于是从远程获取最新版本并merge到本地
git pull origin master
git pull 相当于从远程获取最新版本并merge到本地
在实际使用中,git fetch更安全一些
创建标签
切换到需要打标签的分支上
git branch
git checkout master
敲命令 git tag
git tag v1.0
查看所有标签
git tag
忘了打标签怎么办
方法是找到历史提交的commit id
git log --pretty=oneline --abbrev-commit
$ git tag v0.9 f52c633
查看标签信息
git show v0.9
如果打错标签,可以删除
git tag -d v0.1
推送标签到远程
git push origin v.0
一次性推送全部尚未推送到远程的本地标签:
git push origin --tags
删除远程标签比较麻烦
先从本地删除
git tag -d v0.9
然后从远程删除
git push origin :refs/tags/v0.9
//使用GitHub
访问开源项目主页
点击Fork 就在自己的账号下克隆了一个bootstrap仓库
然后从自己的账号下克隆
git clone git@github.com:michaelliao/bootstrap.git