当咱们须要删除暂存区
或分支
上的文件, 同时工做区也不须要这个文件了, 可使用
1 git rm file_path 2 git commit -m 'delete somefile' 3 git push
当咱们须要删除暂存区
或分支
上的文件, 但本地又须要使用, 只是不但愿这个文件被版本控制, 可使用
git rm --cached file_path git commit -m 'delete remote somefile' git push
https://tortoisegit.org/download/html
1. git config --global user.name xxx 2. git config --global user.email xxx@xxx 3. ssh-keygen -C xxx@xxx -t rsa
//第3步分为下面3个小步骤 (1)公钥保存地址 按回车选择默认 (2)私钥密码-为了后续使用方便 设置为空 (3)生成公钥和私钥
identification has been saved in /c/Users/xxx/.ssh/id_rsa.
public key has been saved in /c/Users/xxx/.ssh/id_rsa.pub.
// git公钥------/c/Users/xxx/.ssh/id_rsa.pub.文件中的内容
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC/pYFUKMZUPNJtjOdSQl74GH4JxAQ8F+EqaMoR9Yw+5VNW81eWrrbbSsjpEDPaZIbb0Sc89oJ4Uzi2lpHjhTujMmdzf2TrfOaGRa2+M5Ey4Z1MXuT4RVawrZ/PtK7tTI+eMKc
/NZqhcp9e+NYIVzbwUMqvAnx+OTgDF3RYmYWDcbvTX0AybOBd/NwV1BtR5PkPRHlGQN0Oi5wHmvXmP9WIQ9dAoi+w63mhL+c8a8Qu+PBZBiknzJRB1p9dtIOEPdq5ltGAqluEZ0FTEzet1qH0pAUaOxxEsZAhGpa9453rQJ433
Emg7hy30KomOQvFp64T6QlTGFKIg9EMm9t8Ny2r xxx@xxx
git推荐使用SSH协议的缘由
使用SSH协议能够避免每次输入密码。前提是在帐户里配置好SSH秘钥。 git@github.com开头的就是SSH协议。 使用Https协议则会致使每次都会输入用户名和密码。
push
鼠标点击git bash界面的标题栏,鼠标右键选择git
// 窗口尺寸设置github
options --> windows -->修改行数(高度)+列数(宽度)算法
// 窗口字体设置windows
options --> text -->设置字体大小缓存
扩展安全
// 了解一下win7的命令窗口设置bash
http://article.pchome.net/content-1245289-all.html服务器
// 从零开始建立
1.git init 建立一个空的Git库。在当前目录中产生一个.git 的子目录。之后,全部的文件变化信息都会保存到这个目录下 2.git init --bare 建立备份仓库(在服务器或者工程目录之外路径均可以建立的备份仓库)
// 克隆已有仓库建立
git clone /path/to/repository // 本地库
git clone git/ssh/http[s]/ftp[s]/file/rsync:username@ip/path/to/repository // 远端服务器
git clone的本质就是把“Git目录”里面的内容拷贝过来,通常的“Git目录”里有成千上万的各类对象(提交对象,树对象,二进制对象, tag对象......),若是逐一复制的话,其效率就可想而知。app
若是经过git、ssh协议传输,服务器端会在传输前把须要传输的各类对象先打好包再进行传输;而http(s)协议则会反复请求要传输的不一样对象。若是仓库里面的提交很少的话,前者和后者的效率相差很少;可是若仓库里有不少提交的话,git、ssh协议进行传输则会更有效率。不过如今Git对http(s)协议传输Git仓库作了必定的优化,http(s)传输如今也能达到ssh协议的效率
.git目录的组成
COMMIT_EDITMSG # 保存着上一次提交时的注释信息 config # 项目的配置信息 description # 项目的描述信息 HEAD # 项目当前在哪一个分支的信息
index # 索引文件,git add以后要添加的内容暂存在这里 hooks/ # 默认的“hooks” 脚本文件 info/ # 里面有一个exclude文件,指定本项目要忽略的文件 #,看一下这里 logs/ # 各个refs的历史信息 objects/ # 这个目录很是重要,里面存储都是Git的数据对象 # 包括:提交(commits), 树对象(trees),二进制对象 #(blobs),标签对象(tags)。
# 在objects目录下,SHA串的前两个字符做为目录名,后面的38个字符做为文件名
refs/ # 标识着你的每一个分支指向哪一个提交(commit)。
// 查看提交文件的内容,2d832d是SHA(安全hash算法)签名值
$ git cat-file -p 2d832d
// 详细请参考 本地仓库的建立和构成
http://www.infoq.com/cn/news/2011/02/git-adventures-local-repository
git config, -- 仅对当前项目
--global -- 对当前登陆者
--system -- 对全部登陆这台电脑的人
git config -e --[local|global|system]
本地和远程工做流
你的本地代码 由 git 维护的三棵“树”组成。第一个是你的 工做目录
,它持有实际文件;第二个是 缓存区(Index/stage)
,它像个缓存区域,临时保存你的改动;最后是本地仓库( HEAD)
,指向你最近一次提交后的结果。
git clone 用于创建本地仓库 // origin 是git clone默认使用的远程主机名
经过git clone获取远端git库后,.git/config中的开发者信息不会被一块儿clone过来。仍然须要为本地库的.git/config文件添加开发者信息。此外,开发者还须要本身添加 . gitignore文件。
经过git clone获取的远端git库,只包含了远端git库的当前工做分支。若是想获取其它分支信息,须要使用 “git branch –r” 来查看, 若是须要将远程的其它分支代码也获取过来,可使用命令 “ git checkout -b 本地分支名 远程分支名”,
其中,远程分支名为 “git branch –r” 所列出的分支名, 通常是诸如“origin/分支名”的样子。若是本地分支名已经存在, 则不须要“-b”参数。
git fetch
从远程获取最新版本到本地,不会自动merge,比git pull更安全些。
若是先使用 git fetch ,再使用git checkout nov/eclair_rocket,则是先从服务器上获取最新的更新信息,而后从服务器上下载最新的代码。
git pull
从服务器的仓库中获取代码,和本地代码合并。等同于: Git fetch + Git merge
这条命令将从远端git库的远端分支名获取到本地git库的一个本地分支中。其中,若是不写本地分支名,则默认pull到本地当前分支。 若是你的本地分支已经有内容,则git pull会合并这些文件,若是有冲突会报警。
和是针对全部分支进行的操做。也就是说即便我切换到一个次分支, 若是这个分支和远端的分支已关联了的话,那么执行会把分支和分支都更新到远端。
git pullgit pushalphagit pullmasteralpha
git push --set-upstream origin 远程分支名
你的改动如今已经在本地仓库的 HEAD 中了。执行以下命令以将这些改动提交到远端仓库:
git push origin master
git push不会自动合并文件。所以,若是git push时,发生了冲突,就会被后push的文件内容强行覆盖,并且没有什么提示。 这在合做开发时是很危险的事情。
能够把master换成你想要推送的任何分支。
若是你尚未克隆现有仓库,并欲将你的仓库链接到某个远程服务器,你可使用以下命令添加:
git remote add origin <server>
如此你就可以将你的改动推送到所添加的服务器上去了
你能够计划改动(把它们添加到缓存区),使用以下命令:
git add dir1 # 添加dir1这个目录,目录下的全部文件都被加入 git add f1 f2 # 添加f1,f2文件 git add -u #-u是update的缩写,只监听已经被加入的文件 将本地包括修改和删除,不包括新增的文件和.gitignore中设置的忽略文件 添加到暂存区
git add . #监听工做区的状态树,把工做区状态树的全部变化提交到暂存区, 包括新增的和修改的,不包括删除的文件和.gitignore中设置的忽略文件
git add -A 等于 git add . + git add -u
git add * #将本地全部有改动的文件(包括.gitignore中要忽略的文件)都添加到git缓冲区以待提交 git rm --cache a.c #删除已提交到本地仓库的文件
这是 git 基本工做流程的第一步;使用以下命令以实际提交改动:
git commit -m "代码提交信息" git commit -a -m "代码提交信息" # git commit -a是把unstaged的文件变成staged(这里不包括新建(untracked)的文件),而后commit git commit --amend # 修改提交的commit(没有push) git commit --amend -m "comment" # 修改commit注解
如今,你的改动已经提交到了 HEAD,可是还没到你的远端仓库。
当咱们须要删除暂存区
或分支
上的文件, 同时工做区也不须要这个文件了, 可使用
1 git rm file_path 2 git commit -m 'delete somefile' 3 git push
当咱们须要删除暂存区
或分支
上的文件, 但本地又须要使用, 只是不但愿这个文件被版本控制, 可使用
git rm --cached file_path git commit -m 'delete remote somefile' git push
新建一个跟踪远程分支的本地分支
git checkout -b [branch] origin/[branch]
分支是用来将特性开发绝缘开来的。在你建立仓库的时候,master 是“默认的”。在其余分支上进行开发,完成后再将它们合并到主分支上。
git checkout -b feature_x建立一个叫作“feature_x”的分支,并切换过去:
切换回主分支:
git checkout master
再把新建的分支删掉:
git branch -d feature_x
除非你将分支推送到远端仓库,否则该分支就是 不为他人所见的:
git push origin <branch>
重命名本地分支
git branch -m branch-old-name branch-new-name
删除远程分支
git push origin --delete test_branch
git 切换分支时,若是当前分支开发到一半,没有提交,会被带到另外一分支
使用git stash命令暂存
使用git stash pop 恢复
使用git stash list 查看暂存内容
使用git stash clear 删除暂存内容
要更新你的本地仓库至最新改动,执行:
git pull origin <remote-branch> <local-branch>
git fetch origin <remote-branch>
git pull --ff 出现编辑界面的退出方法
先按esc,而后shift+:,wq就是保存退出
在软件发布时建立标签,是被推荐的。这是个旧有概念,在 SVN 中也有。能够执行以下命令以建立一个叫作 1.0.0 的标签:
git tag 1.0.0 1b2e1d63ff
1b2e1d63ff 是你想要标记的提交 ID 的前 10 位字符。使用以下命令获取提交 ID:
git log
你也能够用该提交 ID 的少一些的前几位,只要它是惟一的。
// 给tag添加注释 git tag -v1.4 -m 'my version 1.4'
// 显示tag版本记录
git show tag-name
// 一次性推送全部tag到远程服务器
git push origin --tags
// 取出打过tag的某个版本
git checkout -b branch_name tag_name
// 删除tag时需注意,若是向远程服务器提交了tag,则删除tag时,不只要删除本地的tag,还要删除远程的tag // 删除本地的tag命令是 git tag -d tag-name // 删除远程tag的命令是 git push origin --delete tag-name
假如你作错事(天然,这是不可能的),你可使用以下命令替换掉本地改动:
git checkout -- <filename>
此命令会使用 HEAD 中的最新内容替换掉你的工做目录中的文件。已添加到缓存区的改动,以及新文件,都不受影响。
假如你想要丢弃你全部的本地改动与提交,能够到服务器上获取最新的版本并将你本地主分支指向到它:
git fetch origin master
git reset origin/master --hard
可参考如下两个网址
git ignore文件的三种设置方式[http://www.jianshu.com/p/267cd94f1d49 ]
git ignore文件设置的具体语法[http://www.cnblogs.com/pylemon/archive/2012/07/16/2593112.html#3226325]
重点说一下踩过的坑:
.gitignore 文件能够忽略本身。忽略的文件,只针对未跟踪文件有效,对已加入版本库的文件无效。
git check-ignore 可用来检查所写的忽略文件语法是否正确
忽略文件的原则是:
1.忽略操做系统自动生成的文件,好比缩略图等;
2.忽略编译生成的中间文件、可执行文件等,也就是若是一个文件是经过另外一个文件自动生成的,那自动生成的文件就不必放进版本库,好比Java编译产生的.class
文件;
3.忽略你本身的带有敏感信息的配置文件,好比存放口令的配置文件。
不须要从头写.gitignore
文件,GitHub已经为咱们准备了各类配置文件,只须要组合一下就可使用了,好比分别输入Tags和SublimeText,在下面的网址中查询忽略规则 https://www.gitignore.io/
假设此时,你忽然接到一个电话说有个很严重的问题须要紧急修补,那么能够按照下面的方式处理:
$ git checkout -b iss53 // 在master分支上新建一个iss53分支
至关于执行下面这两条命令:
$ git branch iss53
$ git checkout iss53
// 将hotfix分支合并到master $ git checkout master $ git merge hotfix --no-ff
合并分支时,若是可能,Git会用Fast forward
模式,但这种模式下,删除分支后,会丢掉分支信息。若是要强制禁用Fast forward
模式,Git就会在merge时生成一个新的commit,这样,从分支历史上就能够看出分支信息。
git merge 分支名 --no-ff -m" 本次合并添加的注释信息"
合并时发生冲突的提示信息
$ git merge iss53 Auto-merging index.html CONFLICT (content): Merge conflict in index.html Automatic merge failed; fix conflicts and then commit the result.
合并状态的查看
$ git status On branch master You have unmerged paths. (fix conflicts and run "git commit") Unmerged paths: (use "git add <file>..." to mark resolution) both modified: index.html no changes added to commit (use "git add" and/or "git commit -a")
任何包含未解决冲突的文件都会以未合并(unmerged)的状态列出。Git 会在有冲突的文件里加入标准的冲突解决标记,能够经过它们来手工定位并解决这些冲突。能够看到此文件包含相似下面这样的部分:
<<<<<<< HEAD <div id="footer">contact : email.support@github.com</div> ======= <div id="footer"> please contact us at support@github.com </div> >>>>>>> iss53
能够看到 =======
隔开的上半部分,是 HEAD
(即 master
分支,在运行 merge
命令时所切换到的分支)中的内容,下半部分是在 iss53
分支中的内容。解决冲突的办法无非是两者选其一或者由你亲自整合到一块儿。好比你能够经过把这段内容替换为下面这样来解决:
这个解决方案各采纳了两个分支中的一部份内容,并且我还删除了 <<<<<<<
,=======
和 >>>>>>>
这些行。在解决了全部文件里的全部冲突后,运行 git add
将把它们标记为已解决状态(译注:实际上就是来一次快照保存到暂存区域。)。由于一旦暂存,就表示冲突已经解决。
git branch -d studyGit // 对studyGit分支进行合并后,才能删除得了studyGit分支 git branch -D studyGit // 强制删除studyGit分支
再运行一次 git status
来确认全部冲突都已解决:
$ git status On branch master Changes to be committed: (use "git reset HEAD <file>..." to unstage) modified: index.html
若是以为满意了,而且确认全部冲突都已解决,也就是进入了暂存区,就能够用 git commit
来完成此次合并提交。提交的记录差很少是这样:
git rebase 合并出错
git rebase --abort 终止合并
git rebase --continue 继续合并
Git - 分支的新建与合并可参考下文
http://gitbook.liuhui998.com/4_2.html
git rebase生成的历史记录线比较好看
开发过程当中,若你在开发的branch功能比较多, commit的量也比较多时,建议使用rebase将你如今的branch整理过再合并回主干,这样会产生较漂亮的线
1、git checkout the_branch 2、git pull 3、git branch the_branch_backup //备份一下这个分支当前的状况 4、git reset --hard the_commit_id //把the_branch本地回滚到the_commit_id 5、git push origin :the_branch //删除远程 the_branch 6、git push origin the_branch //用回滚后的本地分支从新创建远程分支 7、git push origin :the_branch_backup //若是前面都成功了,删除这个备份分支
--soft 回退commit --mixed 回退commit和stage --hard 回退commit stage workspace //本地仓库回退到某个版本 git reset version_hash --hard // 推送至远程仓库,使远程仓库回退到某个版本 git push 远程主机名 远程目录 -f
Git的版本回退速度很是快,由于Git在内部有个指向当前版本的HEAD
指针,当你回退版本的时候,Git仅仅是把HEAD从指向append GPL
版本号不必写全,前几位就能够了,Git会自动去找。固然也不能只写前一两位,由于Git可能会找到多个版本号,就没法肯定是哪个了。
git reset --hard 3628164
在英文输入状态下,按Q就退出了
http://blog.csdn.net/caz28/article/details/43602879
git revert 和 git reset 只有在回退最近的一次提交时,才是等效的
(1)git revert会使提交记录增多,git reset会使提交记录减小
(2)git revert只是撤销指定版本的提交,git reset是回卷,会撤销指定版本以后的全部提交
git reset HEAD~3
git revert HEAD~3
(3) git reset只能针对本地操做,不能对远程服务器执行一样的操做。
revert后若是不想撤销了,看一下log,reset回去就能够了。
reset后后悔了怎么办,没有log了!不要紧,下面命令能够查到更多commit ID:
git reflog
再输入:
git reset <commit ID>
这个commit ID是上次reset前的ID,就能够回退会reset之前状态了。
在Git中,老是有后悔药能够吃的
git reflog 记录你操做的每一条指令
HEAD
指向的版本就是当前版本,所以,Git容许咱们在版本的历史之间穿梭,使用命令git reset --hard commit_id
。
穿梭前,用git log
能够查看提交历史,以便肯定要回退到哪一个版本。
要重返将来,用git reflog
查看命令历史,以便肯定要回到将来的哪一个版本。
// 可参考这篇文章 版本回退
// git revert
http://samael65535.github.io/git/2013/01/18/git/
内建的图形化 git:gitk
彩色的 git 输出:git config color.ui true
显示历史记录时,只显示一行注释信息:git config format.pretty oneline
若是嫌输出信息太多,看得眼花缭乱的,能够试试加上--pretty=oneline
参数:
git log --pretty=oneline --abbrev-commit
你看到的一大串相似3628164...882e1e0
的是commit id
(版本号),和SVN不同,Git的commit id
不是1,2,3……递增的数字,而是一个SHA1计算出来的一个很是大的数字,用十六进制表示,并且你看到的commit id
和个人确定不同,以你本身的为准。为何commit id
须要用这么一大串数字表示呢?由于Git是分布式的版本控制系统,后面咱们还要研究多人在同一个版本库里工做,若是你们都用1,2,3……做为版本号,那确定就冲突了。
在Git中,用HEAD
表示当前版本,也就是最新的提交3628164...882e1e0
(注意个人提交ID和你的确定不同),上一个版本就是HEAD^
,上上一个版本就是HEAD^^
,固然往上100个版本写100个^
比较容易数不过来,因此写成HEAD~100
。
使用心得:
1.要看一下每条git命令的回显,看看是否是你要执行的操做, 有没有遗漏或报错或者执行终止的状况
2.对于异常操做,必定要保留现场,查明缘由,这样记忆更深入。
想进一步了解git指令的话,可阅读下面几篇文章
git 入门级指令
https://github.com/guodongxiaren/LinuxTool/blob/master/git.md
git经常使用命令解说
http://zensheno.blog.51cto.com/2712776/490748
git经常使用命令总结
http://blog.csdn.net/a396901990/article/details/43428905
git简明教程
http://shahdza.blog.51cto.com/2410787/1616345
比较系统的git教程