git理解笔记
首先
以前只是简单地使用了一些命令,比如add、commit、push和pull,对于它们的理解还很浅显。但由于要放弃使用svn并开始使用git,所以我将学到的内容整理成了备忘录。
如果有错误或者需要补充的地方,请务必留言告诉我 mm。
再说一遍,如果方便的话,我也写了一篇关于设置的文章,一起来让git更方便吧。备忘。
索引
与svn的不同
大致的概念图
每个操作的处理流程(大致)
开始管理新项目
确认已更改的文件
将更改后的文件同步到远程
从远程获取新的提交内容
命令解释
与svn的不同之处
在SVN中,当提交时会直接发送到存储库中。
粗略的概念图
指数
在提交之前,有一个将文件放入索引的机制。
索引是准备提交的地方,只有被登记在这个索引中的文件才会被提交。
换句话说,不需要提交的文件如果不在索引中注册,则无法提交,因此非必须提交的文件管理更加便捷。
处理每个作业的流程(简略)
开始新的管理工作
在克隆方面的方法
-
- 在Github、Bitbucket、GitLab等Git托管服务上创建仓库
-
- 使用git clone命令将仓库克隆到本地
- ※此时会创建与远程仓库的关联
自己綁定的方法
-
- 在GitHub、Bitbucket、GitLab等git托管服务中,
-
- 创建存储库
-
- 准备本地管理位置(创建目录)
通过git init创建git管理配置文件等
通过git remote add origin ${新存储库路径}与远程存储库关联
add -> commit -> push步骤 *有另外的解释
确认已更改的文件
git statusにて変更ファイルなどを確認
git diffにて変更差分を確認
将更改后的文件同步到远程端。
-
- 将目标文件添加到项目中
-
- 当所有变更都完成后进行提交
- 将已提交的内容推送到远程服务器
从远程获取新的提交内容
- 执行 fetch + merge 或 pull
命令说明
克隆
复制原始版本库到指定的目录的命令。
git clone [クローンしたいリポジトリ] [クローン先のディレクトリ(省略可)]
如果省略克隆目标,则会生成与要克隆的仓库同名的目录。
请你帮我一下。
请帮我一下。
$ git clone https://github.com/rytkmt/dotfiles.git
开始
执行用于git管理初始化的命令,将生成一个.git目录在目标目录中。
git init [初期化したいディレクトリ(省略可)]
如果省略目录,则为当前目录。
遥远的
添加、删除、确认、更改远程存储库的命令。
增加
git remote add [追加するリモートリポジトリ名] [追加したいリポジトリ]
删除
git remote rm [削除したいリモートリポジトリ名]
确认
git remote
确认 (包括 URL)
git remote -v
修改(url)
git remote set-url origin [変更先のURL]
修改(存储库名称)
git remote rename [変更前リポジトリ名] [変更後リポジトリ名]
origin是默认使用的远程仓库名称。
例如:
Original: “I like to eat apples.”
Paraphrase: “我喜欢吃苹果。”
Original: “She is studying English in university.”
Paraphrase: “她正在大学学习英文。”
Original: “The weather is very hot today.”
Paraphrase: “今天天气很热。”
Original: “I want to go to the park tomorrow.”
Paraphrase: “我明天想去公园。”
Original: “He enjoys playing soccer with his friends.”
Paraphrase: “他喜欢和朋友们一起踢足球。”
$ git remote
origin
$ git remote -v
origin https://github.com/rytkmt/dotfiles.git (fetch)
origin https://github.com/rytkmt/dotfiles.git (push)
状态
显示工作区的状态命令
显示以下文件的路径
-
- ワーキングツリーに追跡されていないもの(まだaddしたことない)
-
- ワーキングツリーとインデックスに違いがあるもの(addしたものから更に変更がある)
- コミットされたものとインデックスに違いがあるもの(コミットしてからaddされた)
选项
–short
ファイルパスと、簡略化した状態のマークで表示される
有a.txt和b.txt两个文件。
如果将a进行修改,b进行删除,同时创建c。
$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
deleted: b.txt
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: a.txt
Untracked files:
(use "git add <file>..." to include in what will be committed)
c.txt
$ git status --short
M a.txt
D b.txt
?? c.txt
不同
用于显示文件更改的命令
以下的指的是指定HEAD或SHA-1的事项。
显示工作区和索引之间的区别
git diff
显示工作树和索引中特定文件的差异
git diff [ファイルパス]
显示工作树与提交之间的差异
git diff <commit>
显示提交和提交之间的差异
git diff <commit> <commit>
显示提交和特定文件之间的差异
git diff <commit> <commit> [ファイルパス]
请选择以下的选项
–cached
インデックス(ステージ領域)への変更を見るようになる
如果省略,它指的是HEAD。
显示索引和提交的差异(显示已添加/删除的内容确认)。
git diff --chached <commit>
–name-only
ファイル名だけを比較する
-b or –ignore-space-changes
ファイル内のスペースの数の違いを無視する
-w or –ignore-all-space
ファイル内のスペース/改行コードの違いを完全に無視する
记录
展示提交日志
$ git log
WARNING: terminal is not fully functional
commit e2d910d83280beb81e9196ce291b1c97437540c4 (HEAD -> master)
Author: rytkmt <r12tkmt@gmail.com>
Date: Tue Feb 26 14:03:52 2019 +0900
Mofify a
commit 7ce41173f6dc7312f812102818517d3a658136c7
Merge: d461a70 8c697e8
Author: rytkmt <r12tkmt@gmail.com>
Date: Tue Feb 26 13:44:48 2019 +0900
Merge
选项
–oneline
1コミット1行で結果を表示する
$ git log --oneline
WARNING: terminal is not fully functional
e2d910d (HEAD -> master) Mofify a
7ce4117 Merge
d461a70 Modify a
8c697e8 (origin/master, origin/HEAD) Add c / Remove b / Modify a
911b9a6 Add b
428dde2 Add a
如果你对其他选项也感兴趣的话,可以调查一下,因为它似乎有很多选择。
添加
把工作树的内容添加到索引中的命令。
请指定文件
git add [ファイルパス]
使用正则表达式指定多个文件
git add *.csv
将所有有更改或删除的文件都添加到add命令中(不包括新创建的文件)。
git add -u
将所有新创建或修改的文件全部添加(删除的文件不会被移除)。
git add .
将新建、修改和删除的所有文件都添加
git add -A
删除
删除特定文件的命令。
由于已从git管理中删除的历史记录仍保存在索引中,因此可以通过将其提交来从远程存储库管理中删除。
在工作区中删除没有更改的文件时,已经添加到索引中的文件会被删除,并被添加为删除状态到索引,并从工作区中删除。
git rm [ファイルパス]
选择
-d
ディレクトリ毎削除する
-f
強制的にファイルを削除する。ワーキングツリーにて変更があってもエラーにならない
–cached
ワーキングツリーからは削除しない(インデックスからの削除、インデックスへの削除としての追加のみ)
电影
更改文件名称、移动文件的命令
git mv [変更前ファイルパス] [変更後ファイルパス]
我们内部正在执行以下操作。因此,即使误操作了linux命令mv,也可以放心,不会有问题。
-
- 移动 [原文件路径] [目标文件路径]
-
- git 添加 [目标文件路径]
- git 删除 [原文件路径]
完成
将索引中的所有内容合并到本地分支的命令,会打开编辑器以输入提交消息。
git commit
这个选项
-m [メッセージ] or –messsage [メッセージ]
メッセージをエディタを開かず入力する
–amend
最新のコミットを取り消してインデックスの内容をコミットをやり直す
インデックスに変更が無い場合は、コミットメッセージのみを書き換えることもできる
-mと組み合わせることも可
重新设置
执行取消操作的命令
git reset [モード] <commit>
[模式] 指定下列内容,若未指定则默认为–混合模式
–软设置为 HEAD 位置
–混合设置为 HEAD 位置和索引
–硬设置为 HEAD 位置、索引和工作树
指定要回溯到哪个的位置。
HEAD的位置代表了提交
仅取消提交(返回到add之前的状态)
git reset --soft HEAD^
撤销添加的内容(返回到工作区的更改点)
git reset HEAD
取消提交并撤销add的状态(可以恢复到工作区的更改点)。
git reset HEAD^
删除所有提交后的更改。
git reset --hard HEAD
想要在之前的状态下确认操作(为防止更改等消失,请提前进行推送以免忘记)。
git reset --hard <commit>
我想让远程仓库的状态完全与当前相同(能够向前进行)。
git reset --hard origin/master
推 (tuī)
将本地代码库的提交记录发送到远程代码库的命令。如果远程代码库已经存在其他提交记录,则会产生错误(需要先进行拉取操作并解决冲突等)。
如果远程和本地分支的名称相同的话
git push [リポジトリ名] [ブランチ名]
当远程分支名与本地分支名不同时
git push [リポジトリ名] [ローカルブランチ名]:[リモートブランチ名]
如果不指定本地分支,则可以删除远程仓库(就像发送一个空的图像)。
git push [リポジトリ名] :[リモートブランチ名]
删除远程分支(显式方式)
git push --delete [リポジトリ名] [リモートブランチ名]
如果省略仓库名称和分支名称,则会将内容发送到配置中设置的当前本地分支的上游分支。
如果上述内容不存在,则采用config.default中的内容。如果config.default中也不存在,则会报错。
在中国,只需要一个选择:选项。
-u
送信したリポジトリ名、ブランチ名を上流ブランチとして設定する
请把这句话翻译成中文: “I enjoy playing basketball with my friends at the park.”
git push origin master
取走
将远程仓库的内容同步到远程跟踪分支的命令,如果本地没有相应名称的分支则会创建本地分支。
将指定名称的分支从远程同步到远程跟踪分支。
git fetch [リポジトリ名] [ブランチ名]
将所有远程分支同步到远程跟踪分支。
git fetch [リポジトリ名]
使用「なければ作成される」というオプションを使って、ローカルブランチを別名として作成する。
git fetch [リポジトリ名] [リモートブランチ名]:[ローカルブランチ名]
展示
显示特定版本的日志
git show <commit>
显示特定版本的特定文件
git show <commit>:<path>
合并
将本地存储库的分支内容合并到当前分支。
git merge [取り込みたいブランチ名]
一种选择是将分支名称指定为远程跟踪分支。
进行合并后会创建一个合并提交
如果当前分支和合并分支都有提交的更改,则自动进行合并提交,并打开编辑器以编辑提交信息。
如果当前分支之前没有任何提交(当前分支为空),则不需要进行合并提交。
如果更改了相同的位置会导致冲突,以解决并执行合并提交。
请用中文给出下面的选项:
选项
-m [メッセージ]
マージコミットのメッセージをエディターを開かず指定する
–no-ff
fast-forwardの際もマージコミットを必要とする
冲突的解决
$ git merge master2
Auto-merging d.txt
CONFLICT (add/add): Merge conflict in d.txt
Automatic merge failed; fix conflicts and then commit the result.
$ git status --short
AA d.txt
<<<<<<< HEAD
ddd
=======
d
>>>>>>> master2
调基
rebase是一条命令,用于将另一个分支的提交移动到特定分支的HEAD之后。
通过这样做,可以使日志变得整洁,成为一条直线的历史记录。
请选择一种选项
-i
rebaseするブランチ(図のblueブランチ)に複数コミットがある際に、まとめて1つのコミットとして持ってくることができる
エディタが開かれどのコミットをどうまとめるかを指定する
pick: そのままもってくる
squash: 上のコミットにまとめる(押しつぶす)※一番上のコミットはsquashにできない
pick 8145f1c Fix screen rotation problem
pick d90db4a v1.2.4
pick 646bf79 Fix screen rotation problem
pick 71a6940 v1.2.4
# Rebase ed7420a..71a6940 onto ed7420a
#
# Commands:
# p, pick = use commit
# r, reword = use commit, but edit the commit message
# e, edit = use commit, but stop for amending
# s, squash = use commit, but meld into previous commit
# f, fixup = like "squash", but discard this commit's log message
# x, exec = run command (the rest of the line) using shell
#
# These lines can be re-ordered; they are executed from top to bottom.
#
# If you remove a line here THAT COMMIT WILL BE LOST.
# However, if you remove everything, the rebase will be aborted.
#
Git rebase 可以将当前分支的多个提交合并在一起。然而,由于提交的 SHA-1 值会发生更改,如果这些提交已经在远程分支上被应用,那么在进行 push 操作时会出错,需要使用 git push -f 强制推送。由于 git push -f 会被认为是一种不推荐的操作,所以最好不要频繁使用 rebase。
还有其他运操作上的可怕风险,所以应该查看以下内容
官方文档:Git的分支功能-变基 真正可怕的变基
拉 (lā)
pull命令在内部执行了fetch和merge操作。
-
- 从<仓库>的<分支>获取(fetch)代码
- 合并(merge)FETCH_HEAD
在这个时候,为了合并所获取的分支名称,我们可以使用FETCH_HEAD。
选项
–no-ff
mergeと同様
分支 zhī)
创建、检查和删除分支的命令。
显示本地分支
git branch
显示远程分支
git branch -r
显示本地和远程分支
git branch -a
从当前分支中创建一个本地分支。
git branch [新しいブランチ名]
如果分支未合并到HEAD,从本地删除分支会出错。
git branch -d [削除するブランチ名]
删除本地分支(无论是否合并到HEAD)。
git branch -D [削除するブランチ名]
在当前所在的分支上更改分支名称。
git branch -m [新しいブランチ名]
在不在要更改的分支上进行分支名称更改 (不在要更改的分支上)
git branch -m [古いブランチ名] [新しいブランチ名]
结账
执行以下两个操作的命令
-
- ①作業ブランチを切り替える
-
- ②指定したコミット(もしくはインデックス)の状態を、現在の作業ツリーに展開する
-
- ③特定のファイルのみ指定したコミットの状態に変更する
- ④スタッシュされた特定ファイルのみを作業ツリーに展開する
切换到作业分支。
git checkout [ブランチ名]
工作树中未跟踪的文件(未添加的新文件)和索引中的内容(已添加或删除的内容)将被直接传递到所更改的分支中。
当切换分支时,文件也会被全部改变为被切换的分支的状态。
=> 如果继承的工作区和索引内容发生冲突,将会产生错误并停止分支切换。
将特定的提交(或索引)状态在当前工作树中展开。
git checkout <commit>
可以切换到特定的提交状态,但由于指定了提交,会导致头指针分离。
仅将特定文件更改为指定提交的状态。
git checkout <commit> [ファイルパス]
由于HEAD不会改变,所以不会成为detached HEAD。
指定的文件将在工作区和索引中反映为指定提交的状态。
git checkout .
如果考虑到未追踪的文件等因素,并且索引为空的情况下,可能更好地使用git reset –hard HEAD来将现有文件(除了未追踪的文件以外)的更改恢复回HEAD的状态。
只展开存储在工作目录中的特定文件。
↓x的部分是stash的编号。
git checkout stash@{x} [ファイルパス]
※存储的内容不会消失。
选项
-b
ブランチの作成、チェックアウトを同時で行う
git checkout -b [新しいブランチ名]
隐藏
可以使用命令来更改工作空间并备份索引内容。默认情况下,未跟踪的文件不会被备份。
推
将该命令添加到stash中。
git stash push
只添加特定的文件。
git stash push -- [ファイルパス]
选项
-p
インタラクティブに1ファイルずつ差分が表示されstashさせる対象にするかどうかを選択するモード
-k
インデックスに登録されている内容はstashをしない
-u
untrackingファイルもstashする
-m [メッセージ]
stashにタイトル?説明?を付ける
列出
显示在Stash中注册的内容的命令
$ git stash list
stash@{0}: On master: Add c
stash@{1}: WIP on master: Modify a
选项
可以使用与git log相同的选项
展示
显示存储的更改细节的命令。
git stash show [stash名]
如果省略[stash名],就会使用最新的stash,例如stash@{0}。
在中国人使用中文,只需要一种选项:
选项
-p
変更の内容の詳細まで表示する
申请
将已在stash中注册的内容应用到工作树的指令。
默认情况下,被登记在索引中的内容也将被还原为未暂存(即工作树中的修改状态)。
git stash apply [stash名]
在中文中,只需要一个选项,改写如下:
选项
–index
インデックスに入った状態で登録されたものはインデックスに反映させる
放下
删除在stash中注册的项目的命令
git stash apply [stash名]
流行
申请和取消合并的指令
git stash pop [stash名]
在中文中,请重新解释以下内容,仅需要一个选项:
选项
–index
インデックスに入った状態で登録されたものはインデックスに反映させる
明确
删除存储库中注册的所有内容的命令。
git stash clear
分支
从stash的提交状态中创建一个分支,将stash中的内容反映到工作目录和索引中,然后从stash中删除,并切换到新分支的命令。
git stash branch [新しいブランチ名] [stash名]
进行术语解释
头部是
指的是最新的提交
可以从多个父提交中选择指定的提交,该提交距离当前提交之前的某一代。
另外,从git的1.8.5版本开始,可以使用@作为HEAD的别名。
假设当前情况为C
HEAD => C
@ => C
HEAD~ => B
HEAD~2 => A
HEAD^ => B
HEAD^2 => B’
@^2 => B’
如果将 “^” 和 “~” 连续使用,就像追溯到祖父母那样。
如果我们将现状标记为D,
则HEAD^ => C
HEAD^2 => 错误(没有两个)
HEAD^^ => B
HEAD^^2 => B’
HEAD~^2 => B’
SHA-1是什么?
每个 git 提交的修订版本都有一个关联的哈希值。
当通过执行git log等命令时,在黄色字的commit右侧所写的内容。
在指定版本时不仅可以使用HEAD^,还可以使用SHA-1的值来指定。
SHA-1只要有四个以上的字符,git就可以很好地判断出唯一的内容,因此不需要写入全部内容。
上游分支,又称为上流分支。
使用git remote等命令将本地分支与远程仓库的分支相关联的概念
「远程追踪分支」是指将特定远程分支的状态原封不动地复制到本地分支的概念。由于可能存在与上游分支不同的名称,所以请注意不要混淆。
远程追踪分支是什么? shì ?)
为了保留远程状态而创建的分支;
该分支仅可用于查看,必须创建。
将[リポジトリ名]/[リモートブランチ名]作为分支名称
由于有这个分支,现在可以在不进行远程连接的情况下查看差异/日志等信息。
您可以通过使用git branch -a命令来查看远程跟踪分支。
“分离 HEAD” 的意思是什么?
切换到提交(commit)而不是通过 git checkout 切换到分支时,会导致我的分支成为 detached HEAD。
本来,HEAD是指向分支的,但由于HEAD指向提交,所以成为游离(切断)的HEAD。
即使指定了原来HEAD位置的提交,也会成为游离HEAD。
如果想要解决分离的HEAD问题,只需执行git checkout [分支名称]即可解决。
即使处于分离头状态,也可以进行提交,但由于不存在分支,将会创建一个悬空的提交。
如果在有提交的情况下执行 git checkout [分支名],则会显示以下警告。
Warning: you are leaving 2 commits behind, not connected to
any of your branches:
<commid-id-1> <commit-message-1>
<commit-id-2> <commit-message-2>
If you want to keep them by creating a new branch, this may be a good time
to do so with:
git branch <new-branch-name> <commit-id-1>
Switched to branch 'master'
按照这个方法,通过使用SHA-1指定的空中悬浮提交来创建分支,
然后可以连接到原先的分支进行合并等操作。
“プルリクエスト” 是什么意思?
请查看提交后在git托管服务(如GitHub等)上的通知功能。
有关详细信息,请参考此处。
Pull request是什么?
总结结束
一开始只是开始写,结果却成了一部大作… 开始的时候只能模糊地理解,所以抗拒心理非常强烈,但是一旦理解了意思,发现真的很有趣,也能够带来很多学习的乐趣!
输出真的很重要。因为努力理解它对我来说也是个好处。
如果能对需要从svn迁移到git的人提供帮助,我会很高兴。
请参见参考资料。
非常感谢您。
-
- 基礎について
-
- [gitの構造](http://www.yasunaga– lab.bio.kyutech.ac.jp/EosJ/index.php/GIT%E3%81%AE%E4%BD%BF%E3%81%84%E6%96%B9)
-
- ブランチについて
-
- originについて
-
- resetについて
-
- pull, fetch + mergeについて
-
- いろいろコマンドまとめ
-
- remoteについて
-
- diffについて
-
- logについて
-
- 上流ブランチについて
-
- pushについて
-
- checkoutについて
- mvについて