Git学习笔记

完全学会Git的24课堂
1、初始化文档库
cd /d/exergit/
git init

2、配置相关信息
git config -l —查看所有配置 --list
git config --system -l
git config --global -l
git config user.name ‘yipeng’
git config user.email ‘yipengchen1@163.com’
git config --system user.name ‘yipeng’
git config --unset user.name ‘yipeng’
git config alias.con ‘config -l’ 表示config -l 的别名是con
git config --global core.editor notepad

–global 表示home directory中的.gitconfig配置文件
–system 表示git程序文件夹中的etc\config配置文件
不带参数表示当前工作目录中的配置文件

3、提交文件
git add 1.txt
git status — 查看状态
git commit -m ‘描述、说明信息’ --author=‘操作者名 <Email邮箱>’
git commit --amend -m ‘新的描述’ —commit指令后修改描述

git add . —有个点! 会把新增的文件和被修改的文件加入Git 索引,被删除的文件不会记录在Git中。
git add -u 把被修改的文件和被删除的文件加入Git索引。
git add -A 把新增的文件、被修改的文件以及被删除的文件全部加入Git索引。

4、图形界面
gitk
gitk all

5、建立分支
git branch 分支名
git checkout 分支名 — 切换分支
git checkout -b newbranchname --创建一个新分支并切换到新分支

合并新分支后并删除新分支
git checkout dev
git merge --no-ff newbranchname
git branch -d newbranchname

强制删除新分支
git checkout dev
git branch -D newbranchname

排除不需要加入的文档库
touch .gitignore
在其中加入
.gitignore
folder

网上学习

安装
安装完后设置用户及邮箱
git config --global user.name ‘yipeng’
git config --global user.email ‘yipengchen1@163.com’

创建版本库
mkdir learngit
cd learngit
pwd
git init
ls -ah

文件添加到版本库(提交新文件)
git add 1.txt
git commit -m ‘shuoming xinxi’

查看状态
git status

查看文件变化
git diff 1.txt

查看历史记录
git log

图形方式查看历史状态
git log -5 --graph --stat

reset命令:前进或回退历史版本
回退
HEAD表示当前版本,上一个版本HEAD^ 上上一个版本HEAD^^
上4个版本HEAD~4
git reset --hard HEAD^ ---- 回退到上一个版本
git reset --hard 2ada1e5 ---- 回退到 2ada1e5 这个版本 先用 git reflog 查看操作记录,然后可以选择相关版本

参数:
–hard 重置本地库、暂存区、工作区
–mixed 重置本地库、暂存区
–soft 重置本地库

回退后反悔,又回到之前没有回退时
git reset --hard 58abdbe --(58abdbe 之前的版本号)
git reflog用来记录你的每一次命令,可以找到版本号

git
总结:
HEAD指向的版本就是当前版本,因此,Git允许我们在版本的历史之间穿梭,
使用命令git reset --hard commit_id。
git reset 的意思就是 把HEAD移到
穿梭前,用git log可以查看提交历史,以便确定要回退到哪个版本。
要重返未来,用git reflog查看命令历史,以便确定要回到未来的哪个版本。

Git的版本库里存了很多东西,其中最重要的就是称为(或者叫index)的暂存区
前面讲了我们把文件往Git版本库里添加的时候,是分两步执行的:
第一步是用git add把文件添加进去,实际上就是把文件修改添加到暂存区;
第二步是用git commit提交更改,实际上就是把暂存区的所有内容提交到当前分支。

用git diff HEAD – readme.txt命令可以查看工作区和版本库里面最新版本的区别:

git checkout – file 可以丢弃工作区的修改:
git checkout – file命令中的–很重要,没有–,就变成了“切换到另一个分支”的命令
用命令git reset HEAD 可以把暂存区的修改撤销掉(unstage),重新放回工作区
git reset命令既可以回退版本,也可以把暂存区的修改回退到工作区。当我们用HEAD时,表示最新的版本。

文件回退总结:
库文件回退: git reset --hard 58abdbe --(58abdbe 之前的版本号) — 可先查看需要退回的版本 git reflog filename
暂存区回退: git reset head filename
工作区回退: git checkout filename

删除文件
实际删除文件: rm 3.txt
版本库中再做删除操作
git rm 3.txt
git commit -m ‘shuoming’

把误删除的找回
git checkout – 3.txt

如果也从版本库中删除了,需要找回
git reset --hard HEAD^

命令:git checkout – filename
用暂存区中filename文件来覆盖工作区中的filename文件。相当于取消自上次执行git add filename以来(如果执行过)本地的修改。
这个命令很危险,因为对于本地的修改会悄无声息的覆盖,毫不留情。

命令:git checkout branch – filename
维持HEAD的指向不变。将branch所指向的提交中的filename替换暂存区和工作区中相应的文件。
注意会将暂存区和工作区中的filename文件直接覆盖。
命令:git checkout – 或写做 git checkout .
注意:git checkout命令后的参数为一个点(“.”)。这条命令最危险!会取消所有本地的修改(相对于暂存区)。
相当于将暂存区的所有文件直接覆盖本地文件,不给用户任何确认的机会!注意,HEAD指针是由Checkout命令修改指向

$ git checkout branch
#检出branch分支。要完成图中的三个步骤,更新HEAD以指向branch分支,以及用branch 指向的树更新暂存区和工作区。
$ git checkout
#汇总显示工作区、暂存区与HEAD的差异。
$ git checkout HEAD
#同上
$ git checkout – filename
#用暂存区中filename文件来覆盖工作区中的filename文件。相当于取消自上次执行git add filename以来(如果执行过)的本地修改。
$ git checkout branch – filename
#维持HEAD的指向不变。用branch所指向的提交中filename替换暂存区和工作区中相 应的文件。
注意会将暂存区和工作区中的filename文件直接覆盖。
$ git checkout – . 或写作 git checkout .
#注意git checkout 命令后的参数为一个点(“.”)。这条命令最危险!会取消所有本地的 #修改(相对于暂存区)。
相当于用暂存区的所有文件直接覆盖本地文件,不给用户任何确认的机会!
$ git checkout commit_id – file_name
#如果不加commit_id,那么git checkout – file_name 表示恢复文件到本地版本库中最新的状态。

Git恢复某个已修改的文件
checkout: 恢复某个已修改的文件(撤销未提交的修改)
git checkout file-name
git checkout commit-id filename 回退某个文件到指定版本

revert: 还原已提交的修改(已经提交过的修改,可以反悔)
git revert HEAD
git revert commit-id (还原指定版本)
reset: 撤销当前分支所有修改,恢复到最近一次修改前干净的分支情况
git reset --hard
git clean -fd

reset 命令
在提交层面上,reset将一个分支的末端指向另一个提交。这可以用来移除当前分支的一些提交。比如,下面这两条命令
让 hotfix 分支向后回退了两个提交。
git checkout hotfix
git reset HEAD~2
如果你仔细研究reset命令本身就知道,它本身做的事情就是重置HEAD(当前分支的版本顶端)到另外一个commit。
总的来说,git reset命令是用来将当前branch重置到另外一个commit的,而这个动作可能会将index以及work tree同样影响。

Reset解惑
让我们跟着 reset 看看它都做了什么。它以一种简单可预见的方式直接操纵这三棵树。它做了三个基本操作。
第 1 步:移动 HEAD
reset 做的第一件事是移动 HEAD 的指向。这与改变 HEAD 自身不同(checkout 所做的); reset 移动 HEAD 指向的分支。
这意味着如果 HEAD 设置为 master 分支(例如,你正在 master 分支上),运行 git reset 9e5e64a将会使master指向9e5e64a。

总的来说,git reset命令是用来将当前branch重置到另外一个commit的,而这个动作可能会将index以及work tree同样影响。
比如如果你的master branch(当前checked out)是下面这个样子:
-A - B - C (HEAD, master)
HEAD和master branch是在一起的,而你希望将master指向到B,而不是C,那么你执行
git reset B以便移动master branch到``B那个commit:
-A - B (HEAD, master) # - C is still here, but there’s no branch pointing to it anymore
注意:git reset和checkout是不一样的。如果你运行git checkout B,那么你讲得到:
-A - B (HEAD) - C (master)
这时HEAD和master branch就不在一个点上了,你进入detached HEAD State. HEAD,work tree,index都指向了B,但是master branch却依然
指向C。如果在这个点上,你执行一个新的commit D,那么你讲得到下面(当然这可能并不是你想要的,你可能想要的是创一个branch做bug fix):
-A - B - C (master)

D (HEAD)

限定reset重置范围
前面讲述了 reset 基本形式的行为,不过你还可以给它提供一个作用路径。若指定了一个路径,reset 将会跳 过第 1 步,并且将它的作用范围限定
为指定的文件或文件集合。这样做自然有它的道理,因为 HEAD 只是一个指 针,你无法让它同时指向两个提交中各自的一部分。不过索引和工作
目录 可以部分更新,所以重置会继续进行 第2、3步。现在,假如我们运行git reset file.txt(这其实是git reset --mixed HEAD file.txt的简写形 式,
因为你既没有指定一个提交的 SHA-1 或分支,也没有指定 --soft 或 --hard),它会:
1,移动 HEAD 分支的指向 (已跳过)
2,让索引看起来像 HEAD (到此处停止)
所以它本质上只是将 file.txt 从 HEAD 复制到索引中。

更进一步,我们可以不让 Git 从 HEAD 拉取数据,而是通过具体指定一个提交来拉取该文件的对应版本。我们只需运行
类似 于git reset eb43bf file.txt的命令即可。
reset和checkout
checkout这个命令做的不过是将HEAD移到一个新的分支,然后更新工作目录。因为这可能会覆盖本地的修改,Git 强制你提交或者缓存工作目录中
的所有更改,不然在 checkout 的时候这些更改都会丢失。和 git reset 不一样的是,**git checkout 没有移动这些分支。这对于快速查看项目旧版
本来说非常有用。
checkout对工作目录是安全的,它会通过检查来确保不会将已更改的文件吹走。

  • checkout不会去修改你在Working Directory里修改过的文件
  • checkout则把HEAD移动到另一个分支
  • reset会不做检查把working directory里的所有内容都更新掉
  • reset把branch移动到HEAD指向的地方

reset和revert
git revert可以用在公共分支上,git reset应该用在私有分支上.
git revert用于记录一些新的提交以反转一些早期提交的影响(通常只是一个错误的提交)。如果你想扔掉工作目录中所有未提交的更改,你应该看到
git-reset,特别是–hard选项。如果你想提取特定文件,就像在另一个提交中那样,你应该看到git-checkout,特别是
git checkout – 语法。请谨慎使用这些替代方法,因为它们都会丢弃工作目录中的未提交更改。

reset是用来修改提交历史的,想象这种情况,如果你在2天前提交了一个东西,突然发现这次提交是有问题的。
这个时候你有两个选择,要么使用git revert(推荐),要么使用git reset。
上图可以看到**git reset是会修改版本历史的**,他会丢弃掉一些版本历史。而git revert是根据那个commit逆向生成一个新的commit,版本历史
是不会被破坏的。相比git reset,它不会改变现在的提交历史。因此,git revert可以用在公共分支上,git reset应该用在私有分支上。

你也可以把git revert当作撤销已经提交的更改,而git reset HEAD用来撤销没有提交的更改。就像git checkout 一样,git revert 也有可能会重写
文件。所以,Git会在你执行revert之前要求你提交或者缓存你工作目录中的更改。如果你的更改还没有共享给别人,git reset 是撤销这些更改的简单
方法。当你开发一个功能的时候发现「糟糕,我做了什么?我应该重新来过!」时,reset 就像是 go-to 命令一样。除了在当前分支上操作,你还可以
通过传入这些标记来修改你的缓存区或工作目录:

  • –soft – 缓存区和工作目录都不会被改变
  • –mixed – 默认选项。缓存区和你指定的提交同步,但工作目录不受影响
  • –hard – 缓存区和工作目录都同步到你指定的提交
    把这些标记想成定义 git reset 操作的作用域就容易理解多了,相比 git reset,它不会改变现在的提交历史。因此,git revert 可以用在公共分支上,
    git reset 应该用在私有分支上。

***********远程库操作
远程库操作
要关联一个远程库,使用命令git remote add origin git@server-name:path/repo-name.git;
关联后,使用命令git push -u origin master第一次推送master分支的所有内容;
此后,每次本地提交后,只要有必要,就可以使用命令git push origin master推送最新修改;

用命令git clone克隆一个本地库
git clone git@github.com:kevinyp/ypgit2

创建分支
git checkout -b branch1
git checkout命令加上-b参数表示创建并切换,相当于以下两条命令:
git branch branch1
git checkout branch1

用git branch命令查看当前分支:

git merge命令用于合并指定分支到当前分支
把dev分支的工作成果合并到master分支上:
git checkout master
git merge dev

rebase 和merge一样可以合并文件,不过它会消除分支
git checkout dev
git rebase master — dev原来的分支节点消失,从master新的节点长出分支,最终只存在一条主线。

删除dev分支
git branch -d dev

小结
Git鼓励大量使用分支:
查看分支:git branch
创建分支:git branch
切换分支:git checkout
创建+切换分支:git checkout -b
合并某分支到当前分支:git merge
删除分支:git branch -d

git status也可以告诉我们冲突的文件:
Git用<<<<<<<,=======,>>>>>>>标记出不同分支的内容
当Git无法自动合并分支时,就必须首先解决冲突。解决冲突后,再提交,合并完成。
解决冲突就是把Git合并失败的文件手动编辑为我们希望的内容,再提交。
用git log --graph命令可以看到分支合并图。
用git log看看分支历史

合并分支时,如果可能,Git会用Fast forward模式,但这种模式下,删除分支后,会丢掉分支信息。
如果要强制禁用Fast forward模式,Git就会在merge时生成一个新的commit,这样,从分支历史上就可以看出分支信息。
准备合并dev分支,请注意–no-ff参数,表示禁用Fast forward
git merge --no-ff -m ‘merge with no-ff’ dev

分支策略
在实际开发中,我们应该按照几个基本原则进行分支管理:
首先,master分支应该是非常稳定的,也就是仅用来发布新版本,平时不能在上面干活;
那在哪干活呢?干活都在dev分支上,也就是说,dev分支是不稳定的,到某个时候,比如1.0版本发布时,再把dev分支合并到master上,在master分支发布1.0版本;
你和你的小伙伴们每个人都在dev分支上干活,每个人都有自己的分支,时不时地往dev分支上合并就可以了

Git分支十分强大,在团队开发中应该充分应用。
合并分支时,加上–no-ff参数就可以用普通模式合并,合并后的历史有分支,能看出来曾经做过合并,
而fast forward合并就看不出来曾经做过合并。

Git还提供了一个stash功能,可以把当前工作现场“储藏”起来,等以后恢复现场后继续工作:
用git stash list命令查看“储藏”的工作现场。
需要恢复一下,有两个办法:
一是用git stash apply恢复,但是恢复后,stash内容并不删除,你需要用git stash drop来删除;
另一种方式是用git stash pop,恢复的同时把stash内容也删了:

可以多次stash,恢复的时候,先用git stash list查看,然后恢复指定的stash,用命令:
git stash apply stash@{0}

如果要丢弃一个没有被合并过的分支,可以通过git branch -D 强行删除。

查看远程分支
用git remote -v显示更详细的信息 , 或者 git remote

推送分支
git push origin master
git push origin dev

使用强制push的方法:
$ git push -u origin master -f
git强制提交本地分支覆盖远程分支: git push origin 分支名 --force

我们可以删除已有的GitHub远程库:
git remote rm origin

------远程库的关联、查看、删除 --------------
一.当推送到服务器时首先要添加远程地址的
git remote add origin https://gitee.com/kingCould/HelloWord.git
二.查看本地添加了哪些远程地址
$ git remote -v
origin https://github.com/zhidao/crm.git (fetch)
origin https://github.com/zhidao/crm.git (push)
sdorigin https://github.com/zhidao/erp.git (fetch)
sdorigin https://github.com/zhidao/erp.git (push)
三.删除本地指定的远程地址
git remote remove origin 删除即可 (只是删除本地链接,并不是删除远程库)

让Git显示颜色,会让命令输出看起来更醒目
git config --global color.ui true

设置别名
$ git config --global alias.st status
$ git config --global alias.co checkout
$ git config --global alias.ci commit
$ git config --global alias.br branch

github上的文件和本地不一致的解决方法: 我的步骤通常是这样
git push 如果失败的话,说明网络上的版本已经更改过了,那就
git pull 如果失败的话,说明网络的版本和本地的版本在合并时可能产生冲突,那就
git stash(把本地的修改全部缓存起来) 然后再 git pull
然后再 git stash pop(把缓存起来的修改恢复)
然后如果有冲突解决冲突,没有就 git push

在github上只能删除仓库,却无法删除文件夹或文件, 所以只能通过命令来解决
首先进入你的master文件夹下, Git Bash Here ,打开命令窗口
$ git --help # 帮助命令
$ git pull origin master # 将远程仓库里面的项目拉下来
$ dir # 查看有哪些文件夹
$ git rm -r --cached target # 删除target文件夹
$ git commit -m ‘删除了target’ # 提交,添加操作说明
$ git push -u origin master # 将本次更改更新到github项目上去

windows 下git服务器安装(Gitblit)
0、先需要安装jdk
1、下载Gitblit,下载地址:http://www.gitblit.com/
2、解压缩下载的压缩包即可,无需安装。我的路径为E:\Program Files\gitblit-1.8.0 C:\APP\gitblit-1.8.0
3、转到.\gitblit-1.8.0\data目录,需要修改配置文件 配置gitblit的 defaults.properties
打开defaults.properties分别搜索替换以下信息(参数说明):
server.httpPort = 8888 (http协议的端口 ,请改为自己的端口)
server.httpsPort = 8443 (https 协议的端口 ,请改为自己的端口)
server.httpBindInterface = localhost(http协议下服务器端访问的网址 ip,请改为自己的ip)
server.httpsBindInterface = localhost(https协议下服务器端访问的网址 ip,请改为自己的ip)
git.repositoriesFolder = b a s e F o l d e r / g i t ( {baseFolder}/git ( baseFolder/git{baseFolder}/git是其默认目录,也可以替换为自己指定的文件目录)
4、修改installService.cmd找到installService.cmd文件。用“记事本”打开。修改ARCH,32位系统:SET ARCH=x86;64位系 统:SET ARCH=amd64。添加CD为程序目录 SET CD=D:\Git\Gitblit-1.6.0(你的实际目录)。修改StartParams里的启动参数,给空就可以了。
实际要用SET ARCH=x86 设为amd64服务会有问题!!!
5、右键以管理员身份运行installService.cmd 。
6、在浏览器中打开http://localhost:8888/,成功登陆Gitblit服务器
默认管理员账号密码是admin admin,可以使用默认账号密码登录,然后改密即可。admin/123456 admin/gitadmin

浏览器访问远程库地址: http://172.168.1.237:8888/repositories/TestGitblit
http://172.168.1.237:8888/repositories/TestGitblit
git clone http://admin@172.168.1.237:8888/r/reborn.git

git remote add origin http://admin@172.168.1.237:8888/r/TestGitblit.git --建立远程库到本地库的关联
git push -u origin master --将本地文档推送到远程库

------------配置-----------
@REM arch = x86, amd64, or ia32
SET ARCH=x86
SET CD=C:\APP\gitblit-1.8.0

@REM Be careful not to introduce trailing whitespace after the ^ characters.
@REM Use ; or # to separate values in the --StartParams parameter.
“%CD%%ARCH%\gitblit.exe” //IS//gitblit ^
–DisplayName=“gitblit” ^
–Description=“a pure Java Git solution” ^
–Startup=auto ^
–LogPath=“%CD%\logs” ^
–LogLevel=INFO ^
–LogPrefix=gitblit ^
–StdOutput=auto ^
–StdError=auto ^
–StartPath=“%CD%” ^
–StartClass=org.moxie.MxLauncher ^
–StartMethod=main ^
–StartParams=“” ^
–StartMode=jvm ^
–StopPath=“%CD%” ^
–StopClass=org.moxie.MxLauncher ^
–StopMethod=main ^
–StopParams=“–stop;–baseFolder;%CD%\data” ^
–StopMode=jvm ^
–Classpath=“%CD%\gitblit.jar” ^
–Jvm=auto ^
–JvmMx=1024

– good git websit
https://www.jianshu.com/p/c8cf9a9b0270
http://git.oschina.net/progit/
https://gitee.com/kevinyp001/events

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值