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:\Users\Administrator.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 devmaster分支是主分支,因此要时刻与远程同步;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推送自己的修改;如果推送失败,则因为远程分支比你的本地更新,需要先用git pull试图合并;如果合并有冲突,则解决冲突,并在本地提交;没有冲突或者解决掉冲突后,再用git push origin 推送就能成功!
如果git pull提示no tracking information,则说明本地分支和远程分支的链接关系没有创建,用命令git branch --set-upstream-to origin/。
git diff HEAD 比较的是工作区中的文件与版本库中文件的差异
Rebase
rebase操作的特点:把分叉的提交历史“整理”成一条直线,看上去更直观。缺点是本地的分叉提交已经被修改过了。 git rebasegit 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