git

Git

git练习

学习后的记录

  1. git cherry-pick C1
  2. git tag v1 C2
  3. git branch -f bname C3
  4. git checkout HEAD~2^3~
  5. git pull == git fetch; git merge o/master
  6. git pull --rebase == git fetch; git rebase
  7. git push == git push origin master:master
  8. git push -u origin master

!!! 非常好的文档

操作

配置

  • /etc/gitconfig
  • ~/.gitconfig
  • .git/config

重要概念

GIT科普系列4:仓库/缓冲区/工作副本,傻傻分不清楚?

  • 工作目录(working directory,工作副本):代码目录
  • 版本库(repository):代码目录下的.git目录
  • 缓存区(Stage,或者Index):
  • 暂存区:git stash

初始化

1
2
3
4
5
6
7
8
9
10
git config --list
git config --global user.name "John Doe"
git config --global user.email johndoe@example.com

git init

git remote add origin git@github.com:hontlong/hbase_py.git
git push -u origin master
git clone git@git.coding.net:hontlong/me.git
git status

开发分支

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
git branch # 查看分支
git branch -r # 查看远程分支
git branch test # 创建分支
git checkout -b <new-branch-name> # 创建并转到新分支
git checkout test # 转到分支
git checkout -b 本地分支名 origin/远程分支名 #把远程分支拉到本地(本地原来没有此分支);可能需要先自行`git fetch`以更新版本标记

git push -u origin test # 提交到远程分支,并建立追踪关系
git branch -d branch-name # 删除本地分支
git push origin --delete test # 删除远端分支 提交生效
git log 获取提交的日志,id等
git fetch origin : 和远端保持一致
git pull : 拉取并合并
git reset --hard origin/master: 强制和更新,丢弃撤销全部本地改动
git checkout -b 本地分支 origin/远程分支

git merge
git rebase 这个命令可以让commit信息更清晰,优先使用

git rebase完全明白

真正理解 git fetch, git pull 以及 FETCH_HEAD
理解reset和revert

  • git checkout 转到指定分区
  • git fetch 从远程repo中获取最新提交的代码,并把对应commit-id记录到.git/FETCH_HEAD文件中
    • FETCH_HEAD:是一个版本链接,记录在本地的一个文件中,指向着目前已经从远程仓库取下来的分支的末端版本。
  • git pull = git fetch + git merge
  • git reset 版本回退,会导致回退目标版本之后的代码丢失(需要确认你的确不再需要它们)
    • git log 确认commit it
    • git reset -hard 回退到目标版本
    • git push -f 强制提交到远端
  • git revert 反做,会产生新的版本,只是这个版本的内容和目标版本内容一致
    • git reset HEAD~2
  • git stash 藏匿处,修改、新增的代码,未提交,要转到其它分区,为了避免带到其它分区,可以用这个命令藏匿起来

暂存 stash

在有代码变动,但还不想要commit的时候,可以暂存。

1
2
3
4
5
6
7
8
9
git status #有变动
git stash #把当前变动暂存起来
git stash save "test-cmd-stash" #代码标签的存储,方便记忆
git status #看起来像是没有变动一样
git stash list #查看暂存的内容
git stash apply #应用最新的存储,恢复
git stash pop #apply+drop
git stash drop stash@{0} #移除指定的
git stash show #查看变动 类似 diff

git cherry-pick

对单个commit操作,把某个commit(可以是其它分支的)合并到当前分支

git cherry-pick <commit id>

解决冲突:

  1. 方法也和普通的一样,手工检查。
  2. 执行add命令
  3. 执行commit命令,提交即可

回滚

放弃本地的commit,使用仓库代码

1
2
3
4
5
git checkout master
git fetch --all #拉取代码
git reset --hard origin/master #把当前的head指针指向origin/master,仓库最新版本
git pull #合并到当前库
git status

代码还没有commit

未使用 git add 缓存代码时。

  • git checkout -- filename取消对文件的修改,还原到最近的版本
    未使用 git add 缓存代码时。
  • 另一种方法git reset HEAD filepathname

已经commit但还没有push

  • git reset --hard HEAD^ 回退到上一次commit的状态。

  • git reset --hard origin/master #将本地的状态回退到和远程的一样

  • git reset HEAD~3 当前分支相当于回滚了3个提交点

    reset有3种常用的模式:

    • –soft,只改变提交点,暂存区和工作目录的内容都不改变
    • –mixed,改变提交点,同时改变暂存区的内容。这是默认的回滚方式
    • –hard,暂存区、工作目录的内容都会被修改到与提交点完全一致的状态
  • git revert HEAD # 回到前一次 commit 的狀態

  • git revert HEAD^ # 回到前前一次 commit 的狀態

已经push

https://blog.csdn.net/hao134838/article/details/78438933

  • git reset --hard HEAD~2
  • git push -f

修改commit log

https://xiewenbo.iteye.com/blog/1285693

git commit --amend

Tag

1
2
3
4
5
git tag -a 0.2 -m "Release version 0.2" # 创建 tag
git push --tags origin # 把 tag 推到远程服务器
git push origin v0.1.0 推送特定tag
git tag -d 0.2 删除
git checkout [tagname] #切换标签后处于一个空的分支上

导出

1
git archive v0.1 | gzip > site.tgz

转库

1
git remote set-url origin git@github.com:***/***.git

其它

如果是clone无提交权限的,然后要转为有权限的,需要

  • git statusgit remote rm origin
  • git statusgit remote add origin
  • git statusgit remote add origin git@github.com:hadoop-deployer/hadoop-deployer.git
  • git statusgit push origin

管理空文件夹

  • 在要被管理的空目录下创建.gitignore文件。
  • 在.gitignore文件内写入如下代码。第一行忽略所有文件。第二行除了.gitignore文件不被忽略。
    *
    !.gitignore

原理图解

目录

.
|-- HEAD         # 这个git项目当前处在哪个分支里(当前指针)
|-- config       # 项目的配置信息,git config命令会改动它
|-- description  # 项目的描述信息
|-- hooks/       # 系统默认钩子脚本目录
|-- index        # 索引文件
|-- logs/        # 各个refs的历史信息
|-- objects/     # Git本地仓库的所有对象 (commits, trees, blobs, tags)
`-- refs/        # 标识你项目里的每个分支指向了哪个提交(commit)。
  • HEAD
    当前分支版本的指针,指向当前分支你最近的一个提交。当chechout时,此指向会变。
    *当为master分支时,文件内容为:ref: refs/heads/master
    *当为test分支时,内容为:ref: refs/heads/test
  • index
    暂存区,即将被下一次提交的文件集合
  • refs
    • refs/heads/master : 文件内容是一个commit
    • refs/heads/test
    • refs/remotes/master
    • refs/tags
  • objects

操作和状态和目录

由 project/.git/config 可知: (若有更多, 亦可由此得知)

origin(remote) 是 Repository 的版本
master(branch) 是 local 端, 正在修改的版本
平常沒事不要去動到 origin, 如果動到, 可用 git reset –hard 回覆到沒修改的狀態.

git reset HEAD filename # 從 staging area 狀態回到 unstaging 或 untracked (檔案內容並不會改變)

git checkout filename # 從 unstaging 狀態回到最初 Repository 的檔案(檔案內容變回修改前)

文件状态 工作区域 操作
未跟踪 new file
已修改、未修改 本地:工作目录 git add
已暂存 本地:暂存区 git stash
已提交 本地:本地仓库 git commit
已提交 远程:远程仓库 git push

操作和状态

HEAD:当期分支,当前分支head指向的commit
index:当前分支被跟踪的文件
working copy:可以理解为项目的文件

  • git add git会暂存这个文件到index
  • git commit git会新建一个commit,随后HEAD就指向这个新的commit。
    • HEAD文件指向不变 ref/heads/master
    • 被指向的文件的内容,master,改变,从一个cmomit Id 变为另一个commit Id
  • git reset git会在一个分支内把HEAD指向另一个commit。HEAD指向后移。
    • -soft参数:git仅重置HEAD到另一个commit
    • -mixed参数:重置HEAD到另一个commit,并且重置index以便和HEAD相匹配
    • -hard参数:重置HEAD到另一个commit,并且重置index以便和HEAD相匹配,并且重置working copy也使得其完全匹配起来。(因为working copy就是项目文件,也就是这个命令会覆盖现有文件内容)
  • git revrt git使用一个新的commit来回滚之前的commit。HEAD继续向前。
  • git checkout git会把HEAD指向另一个分支的commit
  • git stash 工作目录 -> 暂存区。注意,这个暂存区真的只是暂存区,用于避免在切换分支是,暂存一些不想要commit的变动。

安装 git/gogs

1
2
3
4
5
yum install -y git
useradd git
cat id_rsa.pub >> /homt/git/.ssh/authorized_keys
git init --bare sample.git
chown -R git:git sample.git

简单 安装git服务

gogs

使用二进制安装,安装使用git用户

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#gogs
sudo adduser git
wget https://dl.gogs.io/0.11.34/linux_amd64.zip

#处理索引大于767
# my.conf
default-storage-engine=INNODB
innodb_large_prefix=on
innodb_file_format=BARRACUDA

# 边运行,边修改
alter table user row_format=dynamic;

issues:https://github.com/gogits/gogs/issues/4894

问题处理

如果提交文件过大,会显示413错误码,是因为nginx的限定。
在server级别配置client_max_body_size 200m;后重载配置就好


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 jaytp@qq.com

💰

×

Help us with donation