Git常用操作

Git建立远程仓库

  1. 远端仓库初始化成裸仓库:
    新建仓库:mkidr [dirname]
    初始化:git init --bare
  2. 从已有项目初始化:

    git init
    git add .
    git commit -m “init”
    git remote add origin ssh://root@localhost:22/path/to/repository
    注:如果设置远程地址出错,使用:git remote remove origin
    推送:git push origin master

  3. 其他成员检出仓库
    执行如下命令以创建一个本地仓库的克隆版本:

    git clone /path/to/repository .
    如果是远端服务器上的仓库,你的命令会是这个样子:
    git clone username@host:/path/to/repository .

Git克隆指定分支

使用Git下载指定分支命令为:git clone -b [分支名] [仓库地址]
使用示例:

git clone -b v2.8.1 https://git.oschina.net/oschina/android-app.git
git clone -b feature/MailServer ssh://git@172.16.2.109:16888/technician/Wartune.Server.git
git clone -b feature/Modify username@host:/path/to/repository .

Git切换到指定远程分支

在本地新建同名的(“dev”)分支,并切换到该分支

git checkout -t origin/dev

该命令等同于:

git checkout -b dev origin/dev
git checkout -b Camp origin/feature/Camp

Git修改远程仓库

本地有clone出来的git厍,则需要修改一下origin的地址,以便能继续push和pull,方法是,在命令行项目所在目录下执行: git remote set-url origin [新地址]

Git查看远程仓库地址:

git remote -vv

Git 查看当前分支对应的远程追踪分支

git branch -vv

Git删除本地分支:

git branch -d [branchname]

Git删除远程分支:

git push origin :[branchname]

Git 理解 Rebase

区别于merge,rebase 将指定分支的历史记录更新为自己的历史记录,而不是产生一次合并的提交。然后将自己本地的多个commit 链接到目标分支的最后面。

git rebase [目标分支]

# 针对错误提交 fb2f677 及其后面所有提交执行【交互式变基】
# rebase当前分支分支,并自动将多个commit自动压缩为一个
git rebase -i --autosquash fb2f677^

# fixup 指令也可以修改某个历史commit,而不是增加新的commit。
# fixup 会自动在修改之后的对应的 commit记录前增加“fixup!” 信息,每调用一次增加一次信息。
git commit --fixup fb2f677

Git 配置pull默认rebase

# 添加[全局]配置
git config --global --add pull.rebase true

# 删除[全局]配置
git config --global --unset pull.rebase

Git 仅查看当前分支的日志

创建新分支之后,查看当前分支相对于主分支有哪些提交

git log master..

Git本地代码回滚:

  1. 未使用git add缓存代码时:
    放弃本地未提交的修改
    git checkout .
    git checkout --[filename]
  2. 已使用git add缓存了代码
    git reset HEAD .
    git reset HEAD --[filename]
  3. 已使用git commit

    回滚到commit-id,commit-id之后提交的commit都去除

    git reset --hard [commit-id]
    

    回滚最近3次提交

    git reset --hard HEAD~3
    

Git移除已提交文件,并取消文件追踪

git rm --cached [file]

先从追踪删除,然后添加到.gitignore中

Git提交时忽略指定文件的变化

https://www.zhihu.com/question/25234996/answer/44083326
https://blog.csdn.net/DaSunWarman/article/details/79384307

assume-unchanged
assume-unchanged 专为应对检查一批文件是否变化耗费颇多的情况而设计。当你翻了此牌,GIT 便假定索引中此部分相关文件于工作副本内不作更改。因此它将避免一大波 stat 请求。每当索引中文件条目变化时则此牌失效(即,此文件变化自上游)。
assume-unchanged 假定开发人员不会更改文件。此标记旨在为无变化文件夹(如 SDK)改善性能。

# 忽略跟踪,切版本还是会检测到修改的文件
git update-index --assume-unchanged [file]
# 恢复跟踪
git update-index --no-assume-unchanged [file]

skip-worktree
skip-worktree 干得更多:哪怕 GIT 知晓文件已被更改(或【还没理解】),却仍会装作没有发生,而以索引中的版本代替之——直至索引遭弃。
skip-worktree 用于命 GIT 不再染指特定文件——即便开发人员可能更改它——的情形。

# 跳过
git update-index --skip-worktree [file]
# 恢复
git update-index --no-skip-worktree [file]

如果被忽略的文件多了,需要找一下:
git ls-files -v | grep '^h\ ' | awk '{print $2}'
恢复所有的:
git ls-files -v | grep '^h' | awk '{print $2}' |xargs git update-index --no-assume-unchanged

Git修复无法识别新增文件

使用ionlevel.csv添加文件,报错:

The following paths are ignored by one of your .gitignore files:
code/bin/config/table/Fashionlevel.csv
Use -f if you really want to add them.
fatal: no files added

说明该文件被配置为忽略了。

可以使用git check-ignore命令检查是哪一行配置忽略了此文件。

# git check-ignore -v Fashionlevel.csv

.gitignore:115:bin      Fashionlevel.csv

或者可以使用git add -f Fashionlevel.csv,强制添加。

Git删除提交记录

git reset --hard [commit_hash]
git push origin HEAD --force

git彻底删除敏感内容

https://www.jianshu.com/p/21830b5cbd41
https://www.jianshu.com/p/58fef32a15bb
操作前记得先备份一下

  1. git filter-branch指令可以移除版本库中的信息,并重写commit记录, 可以强制(--force)git对所有分支和tag的历史记录(--tag-name-filter cat -- -all)执行命令,从历史记录中删除指定文件(git rm --cached --ignore-unmatch [path-to-file])的内容和空提交(--prune-empty)
    删除一个文件,将[path-to-file]替换为指定文件相对路径(以空格分隔多个文件,可以用*匹配目录),在项目顶层目录打开git-bash执行:

    git filter-branch --force --index-filter 'git rm --cached --ignore-unmatch [path-to-file]' --prune-empty --tag-name-filter cat -- --all
    

    还可以直接整个文件夹,比如test

    git filter-branch --force --index-filter 'git rm -r --cached --ignore-unmatch test' --prune-empty --tag-name-filter cat -- --all
    
  2. [可选步骤]执行完成后,归档历史已经清理完成,但还有一些垃圾文件,用下面的命令清理:

    rm -rf .git/refs/original/
    git reflog expire --expire=now --all
    git gc --prune=now
    git gc --aggressive --prune=now
    
  3. 提交(--all 作用于所有分支):

    git push origin --force --all
    
  4. 如果tag中也需要删除敏感数据,则执行

    git push origin --force --tags
    
  5. 若是团队项目,要通知同事rebase仓库,不要merge。merge会将文件重新还原

git 远程分支已经被删除,本地还有远程分支的记录

使用git branch -a 命令可以查看所有本地分支和远程分支(git branch -r可以只查看远程分支)
发现很多远程仓库已经删除的分支在本地依然可以看到。

使用git remote show origin 可以查看哪些远程分支已经被删除,根据提示使用git remote prune origin 就可以将本地的相应分支记录删除。


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

文章标题: Git常用操作

文章字数: 1,665

本文作者: Jun

发布时间: 2018-05-11, 18:24:00

最后更新: 2022-07-05, 10:19:03

原始链接: http://yoursite.com/2018/05/11/git常用操作/

版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。

目录
×

喜欢就点赞,疼爱就打赏