Git 基本操作

本贴最后更新于 2300 天前,其中的信息可能已经东海扬尘

Git 基本操作


1. 删除文件

1.1 本地删除不是真正的删除

当前文件

[root@izwz9f5nsv33jsmjcx0qw1z demo]# ls
demo.txt  s.txt  welcome.log
[root@izwz9f5nsv33jsmjcx0qw1z demo]# rm *.txt
rm: remove regular file ‘demo.txt’? y
rm: remove regular empty file ‘s.txt’? y
[root@izwz9f5nsv33jsmjcx0qw1z demo]# ls
welcome.log
[root@izwz9f5nsv33jsmjcx0qw1z demo]# git ls-files
demo.txt
s.txt
welcome.log
[root@izwz9f5nsv33jsmjcx0qw1z demo]# git status 
# On branch master
# Changes not staged for commit:
#   (use "git add/rm <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#       deleted:    demo.txt
#       deleted:    s.txt
#
no changes added to commit (use "git add" and/or "git commit -a")

可以看出,直接删除工作区这些文件,但是这些文件在暂存区中仍然存在。从文件的状态来看,文件只是在本地进行了删除,尚未添加到暂存区中。也就是说,在工作区删除文件对暂存区和版本库没有任何影响。
若要恢复刚才在工作区删除的文件,用 git checkout --<file> 。其实直接将工作区文件删除掉后,执行 git add 操作,再提交同样可以达到下面 git rm 的效果。


1.2 执行 git rm 命令删除文件

[root@izwz9f5nsv33jsmjcx0qw1z demo]# ls
demo.txt  s.txt  welcome.log
[root@izwz9f5nsv33jsmjcx0qw1z demo]# git rm *.txt
rm 'demo.txt'
rm 's.txt'
[root@izwz9f5nsv33jsmjcx0qw1z demo]# git status 
# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#       deleted:    demo.txt
#       deleted:    s.txt
#
[root@izwz9f5nsv33jsmjcx0qw1z demo]# git commit -am "delete txt file"
[master ecf4754] delete txt file
 2 files changed, 3 deletions(-)
 delete mode 100644 demo.txt
 delete mode 100644 s.txt
[root@izwz9f5nsv33jsmjcx0qw1z demo]# git ls-files --with-tree=HEAD^
demo.txt
s.txt
welcome.log
[root@izwz9f5nsv33jsmjcx0qw1z demo]# git cat-file -p HEAD^:demo.txt
123
qwe
中文测试
[root@izwz9f5nsv33jsmjcx0qw1z demo]# 

通过 git rm 命令删除文件就可以将删除动作加入暂存区,这时执行提交操作,就从真正意义上删除了文件。
不过文件虽在版本库的最新提价中被删除,但是在历史提交中尚在。可以通过 git ls-file --with-tree=HEAD^ 命令查看历史版本中的文件列表,也可以通过 git cat-file -p HEAD^:demo.txt 查看历史版本中文件的内容。


2. 恢复删除的文件

虽然上面删除了文件并提交了。但是只是在最新的提交中删除了文件,我们还是可以从历史提交中恢复文件。

[root@izwz9f5nsv33jsmjcx0qw1z demo]# ls
welcome.log
[root@izwz9f5nsv33jsmjcx0qw1z demo]# git cat-file -p HEAD~1:demo.txt > demo.txt
[root@izwz9f5nsv33jsmjcx0qw1z demo]# ls
demo.txt  welcome.log
[root@izwz9f5nsv33jsmjcx0qw1z demo]# cat demo.txt 
123
qwe
中文测试
[root@izwz9f5nsv33jsmjcx0qw1z demo]# git status -s
?? demo.txt
[root@izwz9f5nsv33jsmjcx0qw1z demo]# 

$ git show HEAD~1:demo.txt > demo.txt
$ git checkout HEAD~1 -- demo.txt
上面这俩命令也可以恢复文件。


3. 移动文件

[root@izwz9f5nsv33jsmjcx0qw1z demo]# ls
demo.txt  stest.txt  welcome.log
[root@izwz9f5nsv33jsmjcx0qw1z demo]# git status 
# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#       renamed:    s.txt -> stest.txt
#
[root@izwz9f5nsv33jsmjcx0qw1z demo]# 
Display all 1472 possibilities? (y or n)
[root@izwz9f5nsv33jsmjcx0qw1z demo]# git commit -am "更名测试"
[master a8dc639] 更名测试
 1 file changed, 0 insertions(+), 0 deletions(-)
 rename s.txt => stest.txt (100%)

git mv 命令可以完成改名操作,并且改名后查看状态有 renamed 标记;在提交时可以看到前后两个文件的相似度(百分比)。
其实 git mv 改名操作,相当于对旧文件执行删除(git rm),对新文件执行添加(git add)如下:

[root@izwz9f5nsv33jsmjcx0qw1z demo]# mv demo.txt newdemo.txt
[root@izwz9f5nsv33jsmjcx0qw1z demo]# ls
newdemo.txt  s.txt  welcome.log
[root@izwz9f5nsv33jsmjcx0qw1z demo]# echo "rename file" >> newdemo.txt 
[root@izwz9f5nsv33jsmjcx0qw1z demo]# git status 
# On branch master
# Changes not staged for commit:
#   (use "git add/rm <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#       deleted:    demo.txt
#
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#
#       newdemo.txt
no changes added to commit (use "git add" and/or "git commit -a")
[root@izwz9f5nsv33jsmjcx0qw1z demo]# git add -A
[root@izwz9f5nsv33jsmjcx0qw1z demo]# git status 
# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#       renamed:    demo.txt -> newdemo.txt
#
[root@izwz9f5nsv33jsmjcx0qw1z demo]# git commit -am "newdemo is from demo.txt"
[master 49dc15d] newdemo is from demo.txt
 1 file changed, 1 insertion(+)
 rename demo.txt => newdemo.txt (63%)
[root@izwz9f5nsv33jsmjcx0qw1z demo]# 

git add -A 执行时,相当于对修改文件执行 git add ,对删除文件执行 git rm ,对本地新增文件执行 git add 。通过查看状态仍然可以看到 renamed 标记,并且提交时文件相似度变了,这是因为我中间改变了文件内容。由此看出,Git 的文件追踪能力真的很强。


4. 文件忽略

在工作区任意目录下创建 .gitignore 文件,将要忽略的文件写入改文件内。忽略只对未加入版本库的文件有效。
使用 --ignored 参数,才会在状态显示中看到被忽略的文件。git status --ignored -s

4.1 本地独享式忽略文件

.gitignore 文件添加到版本库中后,且这个版本库共享给他人时, 这个忽略文件就会出现在他人的工作区中,文件忽略在他人的工作区中同样生效。这样忽略文件就是共享式的。

独享式:

  一种是针对版本库的 独享式 忽略,即在版本库 .git 目录下的一个文件,.git/info/exclude 来设置文件忽略。
另一种是全局式的 独享式 忽略,即通过 Git 的配置变量 core.excludesfile 指定一个忽略文件,其设置的忽略对所有本地版本库均有效,如:git config --global core.excludesfile /home/sw/.gitignore


5. 文件归档

Git 提供了一个创建归档的命令:git archive ,可以对任意提交对应的目录树创建归档。如:

基于最新的提交创建归档文件 latest.zip
git archive -o latest.zip HEAD

只将目录 src 和 doc 建立到归档文件中
git archive -o partial.tar HEAD src doc

在建立归档时,如果使用树对象 ID 进行归档,则使用当前时间作为归档中文件的修改时间,而如果使用提交 ID 或里程碑等,则使用提交建立的时间作为归档中文件的修改时间。
如果使用 tar 格式建立归档,并且使用提交 ID 或里程碑 ID,还会把提交 ID 记录在归档文件的文件头中。记录在文件头中的提交 ID 可以通过 git tar-commit-id 命令获取。
如果在建立归档时想忽略某些文件或目录,可以通过为相应文件或目录建立 export-ignore 属性加以实现。

  • Simon
    20 引用 • 10 回帖
  • Git

    Git 是 Linux Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。

    209 引用 • 358 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...